數據庫索引(Hash和B+)

數據庫索引(Hash和B+)

我們知道數據庫索引有兩種方式
第一:Hash表
第二:B+樹

Hash表

哈希索引(hash index)基於哈希表實現,只有精確匹配索引所有列的查詢纔有效。對於每一行數據,存儲引擎都會對所有的索引列計算一個哈希碼(hash code),哈希碼是一個較小的值,並且不同鍵值的行計算出來的哈希碼也不一樣。哈希索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據行的指針。對於hash相同的,採用鏈表的方式解決衝突。類似於hashmap。因爲索引的結構是十分緊湊的,所以hash索引的查詢很快。
哈希索引比起B樹索引簡單,因爲它不需要遍歷B樹,所以訪問速度會更快

特點:

1,哈希索引只包含哈希值和行指針,而不存儲字段值,所以不能直接使用索引中的值來讀取行。
2,哈希索引數據並不是按照索引值順序存儲的,所以也就無法用於排序。
3,哈希索引也不支持部分索引列匹配查找,因爲哈希索引始終是使用索引列的全部內容來計算哈希值的。
4,哈希索引只支持等值比較查詢,包括=、IN()、<>(注意<>和<=>是不同的操作)。也不支持任何範圍查詢,例如WHERE price>100。
5,訪問哈希索引的數據非常快,除非有很多哈希衝突(不同的索引列值卻有相同的哈希值)。當出現哈希衝突的時候,存儲引擎必須遍歷鏈表中所有的行指針,逐行進行比較,直到找到所有符合條件的行。
6,如果哈希衝突很多的話,一些索引維護操作的代價也會很高。例如,如果在某個選擇性很低(哈希衝突很多)的列上建立哈希索引,那麼當從表中刪除一行時,存儲引擎需要遍歷對應哈希值的鏈表中的每一行,找到並刪除對應行的引用,衝突越多,代價越大。

B+樹

①.全值匹配:指的是和索引中所有列進行匹配。假設以(姓,名,出生日期)三個數據項建立複合索引,那麼可以查找姓名爲張三,出生日期在2000-12-12的人

②.匹配最左前綴:假設以(姓,名,出生日期)三個數據項建立複合索引,可以查找所有姓張的人

③.匹配列前綴:假設有姓爲司徒的人,我們也可以查找第一列的前綴部分,如查找所有以司開頭的姓的人

④.匹配範圍值:可以查找所有在李和張之間的姓的人,注意範圍查詢只在複合索引的優先排序的第一列。(假設姓名按照拼音排序)

⑤.精確匹配前面列並範圍匹配後一列:可以查找姓李並出生日期在2000-12-12之後的人或姓名爲張三並出生日期在2000-12-12之後的人,注意範圍第一個範圍查詢後面的列無法再使用索引查詢

⑥.只訪問索引的查詢:即查詢只需訪問索引,而無需訪問數據行。

B+ Tree索引缺點
①.如果不是按照索引的最左列開始查找,則無法使用索引。如無法查找名爲龍的人,也無法查找在2000-12-12之後出生的人,當然也無法查找姓中以龍結尾的人(注意爲和含有的區別)

②.不能跳過索引中的列:無法查找姓李並在2000-12-12之後出生的人

③.如果查詢中包括某個列的範圍查詢,則其右邊所有列都無法使用索引優化查詢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章