<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 索引功能.
索引由 hash 算法獲得, 是以不一定是唯一 hash 值,需要對索引進行全掃描
如上圖描述, 資料存放後,hash 索引表中, 具有資料及 hash 鍵專用存放的區間, 而每個hash都與某個資料一一對應 (注:再強調一次不一定唯一喲)
常用 innodb 與 myisam 引擎都支援
在 innodb裡,有兩種形态,
一是primary key形态, 其leaf node裡存放的是資料,而且不僅存放了索引鍵的資料, 還存放了其他字段的資料.
二是secondary index, 其leaf node和普通的 b-tree 差不多, 隻是還存放了指向主鍵的資訊.
而在myisam裡,主鍵和其他的并沒有太大差別!
不過和innodb不太一樣的地方是在myisam裡, leaf node裡存放的不是主鍵的資訊, 而是指向資料檔案裡的對應資料行的資訊.
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 一下啟用及關閉時的性能再行決定。