天天看點

mysql hash 索引 vs B-TREE 索引

<a target="_blank" href="http://blog.csdn.net/signmem/article/details/13004837">terry tsang</a>

//我相信最有價值的東西,是很多人都應該因為它而一起學習和進步的!真正有價值的技術,都是值得和所有人分享的!

目前 memory 引擎, innodb 引擎支援 hash 索引, 索引将存放記憶體中. (innodb 存放 buffer pool)

innodb 啟動 <code>innodb-adaptive-hash-index</code> 參數就能夠支援

假設利用  show engine innodb status \g 看到大量類似下圖的等待值 (參見 rw-latch 由 brt0sea.c 産生)

建議你使用 skip-innodb_adaptive_hash_index 關閉 innodb hash 索引功能.

mysql hash 索引 vs B-TREE 索引

索引由 hash 算法獲得, 是以不一定是唯一 hash 值,需要對索引進行全掃描

mysql hash 索引 vs B-TREE 索引

如上圖描述, 資料存放後,hash 索引表中, 具有資料及 hash 鍵專用存放的區間, 而每個hash都與某個資料一一對應 (注:再強調一次不一定唯一喲)

常用 innodb 與 myisam 引擎都支援

在 innodb裡,有兩種形态,

一是primary key形态, 其leaf node裡存放的是資料,而且不僅存放了索引鍵的資料, 還存放了其他字段的資料.

二是secondary index, 其leaf node和普通的 b-tree 差不多, 隻是還存放了指向主鍵的資訊.

而在myisam裡,主鍵和其他的并沒有太大差別!

不過和innodb不太一樣的地方是在myisam裡, leaf node裡存放的不是主鍵的資訊, 而是指向資料檔案裡的對應資料行的資訊.

mysql hash 索引 vs B-TREE 索引

hash 索引隻能夠使用 = &lt;&gt; in 等判斷方法進行搜尋, 對 order by 沒有任何加速功能

b-tree 索引可用于 =, &gt;, &gt;=, &lt;, &lt;=, 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 一下啟用及關閉時的性能再行決定。