mysql索引: 是一種幫助mysql高效的獲取資料的資料結構,這些資料結構以某種方式引用資料,這種結構就是索引。可簡單理解為排好序的快速查詢資料結構。如果要查「mysql」這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。
單值索引:乙個索引包含1個列 create index idx_xx on table(f1) 乙個表可以建多個。 唯一索引: 索引列的值必須唯一,但允許有空值 create unique index idx_xx on table(f1) 復合索引: 乙個索引包含多個列 如:create index idx_xx on table(f1,f2,..)
btree hash索引 full-text全文索引
主鍵自動建立唯一索引 頻繁作為查詢條件的字段因該建立索引 查詢中與其他表關聯的字段,外來鍵關係建立索引 頻繁更新的字段不適合建立索引 where條件裡用不到的字段不建立索引 單鍵/復合索引的選擇(高併發下傾向復合) 查詢中排序的字段因建立索引 查詢中統計或分組字段
頻繁增刪改的表 表記錄太少 資料重複且分布平均的表字段。(重複太多索引意義不大)
乙個經典的b+樹索引資料結構見下圖:
b+樹是乙個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指標相互鏈結。在b+樹上的常規檢索,從根節點到葉子節點的搜尋效率基本相當,不會出現大幅波動,而且基於索引的順序掃瞄時,也可以利用雙向指標快速左右移動,效率非常高。
因此,b+樹索引被廣泛應用於資料庫、檔案系統等場景。
而雜湊索引的示意圖則是這樣的:
簡單地說,雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似b+樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可立刻定位到相應的位置,速度非常快。
從上面的圖來看,b+樹索引和雜湊索引的明顯區別是:
如果是等值查詢,那麼雜湊索引明顯有絕對優勢,因為只需要經過一次演算法即可找到相應的鍵值;當然了,這個前提是,鍵值都是唯一的。如果鍵值不是唯一的,就需要先找到該鍵所在位置,然後再根據鍊錶往後掃瞄,直到找到相應的資料; 從示意圖中也能看到,如果是範圍查詢檢索,這時候雜湊索引就毫無用武之地了,因為原先是有序的鍵值,經過雜湊演算法後,有可能變成不連續的了,就沒辦法再利用索引完成範圍查詢檢索; 同理,雜湊索引也沒辦法利用索引完成排序,以及like 『***%』 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是範圍查詢); 雜湊索引也不支援多列聯合索引的最左匹配規則; b+樹索引的關鍵字檢索效率比較平均,不像b樹那樣波動幅度大,在有大量重複鍵值情況下,雜湊索引的效率也是極低的,因為存在所謂的雜湊碰撞問題。
在mysql中,只有heap/memory引擎表才能顯式支援雜湊索引(ndb也支援,但這個不常用),innodb引擎的自適應雜湊索引(adaptive hash index)不在此列,因為這不是建立索引時可指定的。
還需要注意到:heap/memory引擎表在mysql例項重啟後,資料會丟失。
通常,b+樹索引結構適用於絕大多數場景,像下面這種場景用雜湊索引才更有優勢:
在heap表中,如果儲存的資料重複度很低(也就是說基數很大),對該列資料以等值查詢為主,沒有範圍查詢、沒有排序的時候,特別適合採用雜湊索引
例如這種sql:
select … from t where c1 = ?; — 僅等值查詢
在大多數場景下,都會有範圍查詢、排序、分組等查詢特徵,用b+樹索引就可以了。
索引是什麼?
資料庫引入了索引 使用者對資料庫最頻繁的操作是進行資料查詢。一般情況下,資料庫在進行查詢操作時需要對整個表進行資料搜尋。當表中的資料很多時,搜尋資料就需要很長的時間,這就造成了伺服器的資源浪費。為了提高檢索資料的能力,資料庫引入了索引機制。有關 索引 的比喻 從某種程度上,可以把資料庫看作一本書,把...
索引是什麼
mysql索引結構 哪些情況需要建立索引 哪些情況不需要建立索引 可以簡單理解為 排好序的快速查詢資料結構 一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。建立 create unique index indexname on mytable colum...
索引是什麼?
維基百科對資料庫索引的定義 資料庫索引,是資料庫管理系統 dbms 中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。怎麼理解這個定義呢?首先資料是以檔案的形式存放在磁碟上面的,每一行資料都有它的磁碟位址。如果沒有索引的話,要從500 萬行資料裡面檢索一條資料,只能依次遍歷這張表的全部資料,...