MySQL索引
索引(index)是幫助MySQL高效獲取數據的數據結構,是現實中性能問題的首要問題。
索引類型
B-Tree索引
B-Tree意味著數據存儲是有序的,并且每個葉子頁到根的距離是一樣的。B-Tree索引加速了數據訪問,因為存儲引擎不會掃描整個表得到需要的數據。而是從根節點開始進行樹查找。因為B-Tree按順序保存了索引的列,它們對于搜索范圍數據很有用。
能使用B-Tree索引的查詢類型
B-Tree索引能很好地用于全鍵值、鍵值范圍或鍵前綴查找。
B-Tree索引的一些局限
如果查找沒有從索引列的最左邊開始,他就沒有用處。
不能跳過索引中的列。
存儲引擎不能優化訪問任何在第一個范圍條件右邊的列。
哈希索引(Memory引擎)
哈希索引建立在哈希表的基礎上,它只對使用了索引中的每一列的精確查找有用。對于每一行,存儲引擎計算出了被索引列的哈希碼,它是一個比較小的值,并且有可能和其它行的哈希碼相同。它把哈希碼保存在索引中,并且保存了一個指向哈希表中每一行的指針。
哈希索引的一些局限
因為索引只包含了哈希碼和行指針,而不是值自身,MySQL不能使用索引中的值來避免讀取行。幸運的是,訪問內存中的行很快,因此這通常不會降低性能。
MySQL不能使用哈希索引進行排序,因為它們不會按序保存行。
哈希索引不支持部分鍵匹配,因為它們是由被檢索的全部值計算出來的。
哈希索引只支持使用了=、IN()、和<=>的相等比較,不能加快范圍查詢。(注意<>和<=>不是相同的運算符)
訪問哈希索引中的數據非常快,除非碰撞率非常高。當發生碰撞的時候,存儲引擎必須訪問鏈表中的每一個行指針,然后逐行進行數據比較,以確定正確的數據。
InnoDB存儲引擎有一個特別的功能,叫自適應哈希索引。當InnoDB注意到一些索引值被頻繁訪問的時候,它就回在B-Tree的頂端為這些值建立內存中的索引。