(ainusers原創)Hash索引和BTree索引
注:
Innodb和myisam預設的索引是Btree索引
Hash索引(類比於拼音查詢漢字) BTree(類比於偏旁查詢漢字)
區別(瞭解Innodb和myisam主要還應該從區別開始)
1.主要區別在於:Hash不能用於範圍查詢
2.檢索效率遠高於BTree索引
3.聯合索引(複合索引)中,Hash索引不能利用部分索引鍵查詢
4.BTree支援的聯合索引的最優字首,Hash要麼全部使用,要麼不使用
5. Hash索引無法避免資料的排序操作
由於Hash索引中存放的是經過Hash計算之後的Hash值,而且Hash值的大小關係並不一定和Hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算。
6. Hash索引任何時候都不能避免表掃描
Hash索引是將索引鍵通過Hash運算之後,將Hash運算結果的Hash值和所對應的行指標資訊存放於一個Hash表中,由於不同索引鍵存在相同Hash值,所以即使滿足某個Hash鍵值的資料的記錄條數,也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行比較,並得到相應的結果。
7. Hash索引遇到大量Hash值相等的情況後效能並不一定會比BTree高
對於選擇性比較低的索引鍵,如果建立Hash索引,那麼將會存在大量記錄指標資訊存於同一個Hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料訪問,而造成整體效能底下。
8.Hash索引每次都要全表掃描(解釋檢視第6條)
一、BTree索引
不僅可以被用在=,>,>=,<,<=和between這些比較操作符上,而且還可以用於like操作符(查詢條件是一個不以萬用字元開頭的常量)
select * from user where name like ‘%jack’; //此sql不會使用索引
注:
BTree索引是以B+樹為儲存結構實現的
MyISAM的索引方式也稱為非聚集,Innodb的索引方式成為聚集索引
MyISAM中資料檔案和索引檔案是分開的,Innodb中資料檔案和索引檔案不是分開的
MyISAM中Btree索引去搜索的時候,若key存在,在data域找到其地址,然後根據地址去表中查詢資料記錄。
Innodb中葉子節點儲存的並不是表的地址,而是資料
二、Hash索引
只能用於對等比較,例如=,<=>(相當於=)操作符
注:
當要給某張表某列增加索引時,將這張表的這一列進行雜湊演算法計算,得到雜湊值,排序在雜湊陣列上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要經過B樹進行節點查詢多次的磁碟IO