MySQL索引

openkk 14年前發布 | 2K 次閱讀 5.2.1版本發布

索引(index)是幫助MySQL高效獲取數據的數據結構,是現實中性能問題的首要問題。

索引類型

B-Tree索引

B-Tree意味著數據存儲是有序的,并且每個葉子頁到根的距離是一樣的。B-Tree索引加速了數據訪問,因為存儲引擎不會掃描整個表得到需要的數據。而是從根節點開始進行樹查找。因為B-Tree按順序保存了索引的列,它們對于搜索范圍數據很有用。

能使用B-Tree索引的查詢類型

B-Tree索引能很好地用于全鍵值、鍵值范圍或鍵前綴查找。

B-Tree索引的一些局限

如果查找沒有從索引列的最左邊開始,他就沒有用處。

不能跳過索引中的列。

存儲引擎不能優化訪問任何在第一個范圍條件右邊的列。

哈希索引(Memory引擎)

哈希索引建立在哈希表的基礎上,它只對使用了索引中的每一列的精確查找有用。對于每一行,存儲引擎計算出了被索引列的哈希碼,它是一個比較小的值,并且有可能和其它行的哈希碼相同。它把哈希碼保存在索引中,并且保存了一個指向哈希表中每一行的指針。

哈希索引的一些局限

因為索引只包含了哈希碼和行指針,而不是值自身,MySQL不能使用索引中的值來避免讀取行。幸運的是,訪問內存中的行很快,因此這通常不會降低性能。

MySQL不能使用哈希索引進行排序,因為它們不會按序保存行。

哈希索引不支持部分鍵匹配,因為它們是由被檢索的全部值計算出來的。

哈希索引只支持使用了=、IN()、和<=>的相等比較,不能加快范圍查詢。(注意<>和<=>不是相同的運算符)

訪問哈希索引中的數據非常快,除非碰撞率非常高。當發生碰撞的時候,存儲引擎必須訪問鏈表中的每一個行指針,然后逐行進行數據比較,以確定正確的數據。

InnoDB存儲引擎有一個特別的功能,叫自適應哈希索引。當InnoDB注意到一些索引值被頻繁訪問的時候,它就回在B-Tree的頂端為這些值建立內存中的索引。

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!