mysql 存儲引擎對索引的支持


一、首先給出mysql官方文檔給出的不同存儲引擎對索引的支持

從上面的圖中可以得知,mysql 是支持hash索引的,但支持和不支持又和具體的存儲引擎有關系。從圖中看到InnoDB是支持Btree索引,這是我們眾所周知的。但是不支持hash索引。
但是innoDB存儲引擎支持hash索引是自適應的,innoDB存儲引擎會根據表的使用情況自動為表生成hash索引,不能人為干預是否在一張表中生成hash索引。
 
二、自適應索引的原理

自適應hash索引原理

1、原理過程

 

  Innodb存儲引擎會監控對表上二級索引的查找,如果發現某二級索引被頻繁訪問,二級索引成為熱數據,建立哈希索引可以帶來速度的提升,則:

  1、自適應hash索引功能被打開

mysql> show variables like '%ap%hash_index';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

  2、經常訪問的二級索引數據會自動被生成到hash索引里面去(最近連續被訪問三次的數據),自適應哈希索引通過緩沖池的B+樹構造而來,因此建立的速度很快。

2、特點

  1、無序,沒有樹高

  2、降低對二級索引樹的頻繁訪問資源

    索引樹高<=4,訪問索引:訪問樹、根節點、葉子節點

  3、自適應

3、缺陷

  1、hash自適應索引會占用innodb buffer pool;

  2、自適應hash索引只適合搜索等值的查詢,如select * from table where index_col='xxx',而對於其他查找類型,如范圍查找,是不能使用的;

  3、極端情況下,自適應hash索引才有比較大的意義,可以降低邏輯讀。

 

三、監控與關閉

1、狀態監控

mysql> show engine innodb status\G
……
Hash table size 34673, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

  1、34673:字節為單位,占用內存空間總量

  2、通過hash searches、non-hash searches計算自適應hash索引帶來的收益以及付出,確定是否開啟自適應hash索引

2、限制

  1、只能用於等值比較,例如=, <=>,in

  2、無法用於排序

  3、有沖突可能

  4、MySQL自動管理,人為無法干預。

3、自適應哈希索引的控制

  由於innodb不支持hash索引,但是在某些情況下hash索引的效率很高,於是出現了adaptive hash index功能,但是通過上面的狀態監控,可以計算其收益以及付出,控制該功能開啟與否。

  默認開啟,建議關掉,意義不大。可以通過 set global innodb_adaptive_hash_index=off/on 關閉和打開該功能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM