mysql hash 索引 vs B-TREE 索引 理解
hash 索引
當前 memory 引擎, innodb 引擎支持 hash 索引, 索引將存放內存中,(innodb 存放 buffer pool)
innodb 啟動 innodb-adaptive-hash-index
參數就能夠支持
假設利用 show engine innodb status \G 看到大量類似下圖的等待值 (參見 RW-latch 由 brt0sea.c 產生)
建議你使用 skip-innodb_adaptive_hash_index 關閉 innodb hash 索引功能.
索引由 HASH 算法獲得, 因此不一定是唯一 HASH 值,需要對索引進行全掃描
如上圖描述,數據存放後, HASH 索引表中, 具有數據及 HASH 鍵專用存放的區間, 而每個 HASH 都與某個數據一一對應(注,再強調一次不一定唯一喲)
B-TREE 索引
常用 Innodb 與 MyISAM 引擎都支持
在 Innodb裏,有兩種形態,
一是primary key形態,其leaf node裏存放的是數據,而且不僅存放了索引鍵的數據,還存放了其他字段的數據。
二是secondary index,其leaf node和普通的 B-TREE 差不多,隻是還存放了指向主鍵的信息.
而在MyISAM裏,
主鍵和其他的並沒有太大區別。
不過和Innodb不太一樣的地方是在MyISAM裏,leaf node裏存放的不是主鍵的信息,而是指向數據文件裏的對應數據行的信息.
如圖描述,如需要獲得數據 G6 的信息,那麼I/O 順序為 INDEX PAGE1 -> INDEX PAGE2 -> G -> G6
按照上述順序,隻能夠獲得 G6 對應的索引信息【如塊信息】而已,真正的數據並非存在該表中,利用之前獲得的【塊信息】可以直接從某個數據塊中獲得對應的數據信息, 而不需要進行全表掃描在多個數據塊中搜索數據
速度比較
hash 索引定位快速一步定位數據
B-TREE 索引要從根頁子葉才能夠找到具體數據,可能存在對 I/O 才能夠獲得信息
用於條件判斷比較
hash 索引隻能夠使用 = <> IN 等判斷方法進行搜索, 對 order by 沒有任何加速功能
B-TREE 索引可用於 =, >, >=, <, <=, BETWEE, 同樣可以用於 like 操作
如
select * from t1 where name like 'Parti%'; (支持)
select * from t1 where name like 'Par%ti%'; (支持)
select * from t1 where name like '%Parti'; (不支持)
MySQL 5.6 新參數 --innodb-adaptive-hash-index 能夠令 innodb 也具備 hash index 的特性
默認情況下 5.6 啟用該功能,但不一定能夠獲得好處,因此 HASH 索引將會在 INNODB BUFFER 中占用一定的內存空間。
建議自行 BenchMark 一下啟用及關閉時的性能再行決定。
最後更新:2017-04-03 14:53:53