mysql數據庫存儲結構
B-tree與哈希索引的區別
B-tree索引
索引是按照順序存儲的,所以,如果按照B-tree索引,可以直接返回,帶順序的數據,但這個數據只是該索引列含有的信息。因此是順序I/O
-
適用於:
-
精確匹配
-
范圍匹配
-
最左匹配
-
Hash索引
索引列值的哈希值+數據行指針:因此找到后還需要根據指針去找數據,造成隨機I/O
-
適合:
- 精確匹配
-
不適合:
- 模糊匹配
- 范圍匹配
- 不能排序
-
摘抄其他人的的總結:
-
1、hash索引僅滿足“=”、“IN”和“<=>”查詢,不能使用范圍查詢
因為hash索引比較的是經常hash運算之后的hash值,因此只能進行等值的過濾,不能基於范圍的查找,因為經過hash算法處理后的hash值的大小關系,並不能保證與處理前的hash大小關系對應。
-
2、hash索引無法被用來進行數據的排序操作
由於hash索引中存放的都是經過hash計算之后的值,而hash值的大小關系不一定與hash計算之前的值一樣,所以數據庫無法利用hash索引中的值進行排序操作。
-
3、對於組合索引,Hash 索引在計算 Hash 值的時候是組合索引鍵合並后再一起計算 Hash 值,而不是單
獨計算 Hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash 索引也無法被利用。
-
4、Hash 索引遇到大量Hash值相等的情況后性能並不一定就會比B-Tree索引高。
對於選擇性比較低的索引鍵,如果創建 Hash 索引,那么將會存在大量記錄指針信息存於同一個 Hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據的訪問,而造成整體性能低下。
-
總結:哈希適用在小范圍的精確查找,在列數據很大,又不需要排序,不需要模糊查詢,范圍查詢時有用
