1. 程式人生 > >(ainusers原創)Hash索引和BTree索引

(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