[InnoDB 学习1-8] 自适应哈希索引

 

自适应哈希索引(Adaptive Hash Index)

B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3~4层,故需要3~4次的查询。

InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引。(Adaptive Hash Index, AHI)

AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。InnoDB存储引擎会自动根据访问的频率模式来自动地为某些热点页建立哈希索引。

AHI的要求

  • 要求对这个页的连续访问模式必须是一样的。

    例如:where a=xxxwhere a=xxx and b=xxx,访问模式一样是指查询的条件一样,若交替进行上述2种查询,那么InnoDB存储引擎是不会对该页构造AHI。

  • 以该模式访问了100次; 或 页通过该模式访问了N次,其中N=页中记录*1/16。

注:哈希索引只能用来搜索等值的查询(如:select * from table where index_col='xxx'),对于其它查找类型,如范围查找,是不能使用哈希索引的。

官方文档显示,启用AHI后,读取和写入速度可以提高2倍,辅助索引的连接操作性能可以提高5倍。

mysql> show engine innodb status \G;
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

non-hash searches/s是指,范围查找时,不能使用哈希索引的次数。