跳至主要內容

InnoDB自适应哈希索引

张威大约 3 分钟mysqlmysql索引

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,也是提高数据库性能的一种方式