InnoDB自适应哈希索引
大约 3 分钟
InnoDB自适应哈希索引
自适应哈希索引作用:MySQL Server为避免频繁回表,
- 自动创建的
- 也是只能等值查询
- 是InnoDB对B+树二级索引的一个优化措施
假如name是有索引的,我们不断使用如下的方式查询,那就得先访问name的二级索引树,从二级索引树上取出主键uid,然后回表,用这个uid去主键索引树上取得对应的数据
select * from student where name = "zhangsan";
select * from student where name = "gaoyang";
select * from student where name = "linfeng";
...
InnoDB存储引擎会做如下优化:如果检测到某个二级索引不断被使用,二级索引成为热数据,那么InnoDB会根据在二级索引树上的索引值在构建一个哈希索引来加速搜索()

蓝色的箭头表搜索二级索引树然后回表的过程
黄色箭头就是直接等值查询搜索哈希表,直接拿到数据地址的过程。**使用哈希索引O(1)的时间复杂度就访问到哈希索引name,然后取出data即可(**对于InnoDB来说应该是直接取得数据,而不是拿到数据地址后再访问)
注意:,我们可以查看相关参数指标,如果自适应哈希索引可以提高效率,那我们使用它,否则我们就关闭它
自适应哈希索引是默认开启的:
show variables like 'innodb_adaptive_hash_index';
在MySQL5.7以前,操作哈希表是只有一把锁的,锁的粒度太大,效率很低。在MySQL5.7以后,每个分区都会有自己的锁,锁的粒度减小,要是各个线程在同一个分区(一个分区可以包含一个或多个桶)进行并发操作,就需要加锁。要是在不同的分区操作,就不用加锁。
show variables like 'innodb_adaptive_hash_index_parts';

我们通过以下命令查看两个关键信息:
show engine innodb status\G
- RW-latch阻塞/等待线程的数量,自适应哈希索引默认分配了8个分区,,则需要考虑关闭自适应哈希索引
- ,也需要考虑关闭自适应哈希索引

项目中如果遇到并发量很大,服务器处理请求慢时,可以使用show engine innodb status\G
查看是否需要关闭AHI,也是提高数据库性能的一种方式