MySQL目前主要有如下幾種索引方法:B-Tree,Hash,R-Tree。html
B-Tree是最多見的索引類型,全部值(被索引的列)都是排過序的,每一個葉節點到跟節點距離相等。因此B-Tree適合用來查找某一範圍內的數據,並且能夠直接支持數據排序(ORDER BY)
B-Tree在MyISAM裏的形式和Innodb稍有不一樣:
MyISAM表數據文件和索引文件是分離的,索引文件僅保存數據記錄的磁盤地址
InnoDB表數據文件自己就是主索引,葉節點data域保存了完整的數據記錄算法
1.僅支持"=","IN"和"<=>"精確查詢,不能使用範圍查詢:
因爲Hash索引比較的是進行Hash運算以後的Hash值,因此它只能用於等值的過濾,不能用於基於範圍的過濾,由於通過相應的Hash算法處理以後的Hash
2.不支持排序:
因爲Hash索引中存放的是通過Hash計算以後的Hash值,並且Hash值的大小關係並不必定和Hash運算前的鍵值徹底同樣,因此數據庫沒法利用索引的數據來避免任何排序運算
3.在任什麼時候候都不能避免表掃描:
因爲Hash索引比較的是進行Hash運算以後的Hash值,因此即便取知足某個Hash鍵值的數據的記錄條數,也沒法從Hash索引中直接完成查詢,仍是要經過訪問表中的實際數據進行相應的比較,並獲得相應的結果
4.檢索效率高,索引的檢索能夠一次定位,不像B-Tree索引須要從根節點到枝節點,最後才能訪問到頁節點這樣屢次的IO訪問,因此Hash索引的查詢效率要遠高於B-Tree索引
5.只有Memory引擎支持顯式的Hash索引,可是它的Hash是nonunique的,衝突太多時也會影響查找性能。Memory引擎默認的索引類型便是Hash索引,雖然它也支持B-Tree索引數據庫
R-Tree在MySQL不多使用,僅支持geometry數據類型,支持該類型的存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。性能