1.前言
哈希是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据,而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3~4层,故需要3~4次查询。
2.Adaptive Hash index(AHI)
innodb存储引擎会监控对表上个索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称为为自适应哈希索引。AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。innodb存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。
3.自适应哈希索引要求
AHI有一个要求,即对这个页的连续访问模式必须是一样的,例如(a,b)的联合索引页,其访问模式可以是以下情况
- where a=xxx
- where a=xxx and b=xxx
访问模式一样指的是查询条件一样,若交替进行上述两种查询,那么innodb存储引擎不会对该页构造AHI,此外AHI还有如下的要求:
- 以该模式访问了100次
- 页通过该模式访问了N次,其中N=页中记录 * 1/16
根据innodb存储引擎官方的文档显示,启动了AHI之后,读取和写入速度可以提升2倍,辅助索引的连接操作性能可以提升5倍。毫无疑问,AHI是非常好的优化模式,设计的思想是数据库自优化的(self-tuning),即无需要DBA对数据库进行人为调整。
我们可以通过show engine innodb status命令查看当前AHI的使用情况:
Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) Hash table size 34673, node heap has 0 buffer(s) 0.00 hash searches/s, 0.00 non-hash searches/s ##这里表示的使用哈希索引的次数和未使用哈希索引的次数
4.哈希索引的缺陷
- 索引存放的是hash值,所以仅支持 < = > 以及 IN 操作
- hash索引无法通过操作索引来排序,因为存放的时候经过hash计算,但是计算的hash值和存放的不一定相等,所以无法排序
- 不能避免全表扫描,只是由于在memory表里支持非唯一值hash索引,就是不同的索引键,可能存在相同的hash值
- 如果哈希碰撞很多的话,性能也会变得很差
- 哈希索引无法被用来避免数据的排序操作
参考:http://mysql.taobao.org/monthly/2015/09/01/
https://zhuanlan.zhihu.com/p/268341368
http://blog.itpub.net/15498/viewspace-2157462/
https://blog.csdn.net/cpongo6/article/details/88793524