MySQL系列-InnoDB索引优化AHI、Change buffer

MySQL系列-InnoDB索引优化AHI、Change buffer

运维少年 运维少年

系列文章说明

MySQL系列文章包含了软件安装、具体使用、备份恢复等内容,主要用于记录个人的学习笔记,主要使用的MySQL版本为5.7.28,服务器系统版本为CentOS 7.5。本章节内容为InnoDB索引优化AHI、Change buffer介绍。

索引优化算法-AHI

AHI(Adaptive Hash index - 自适应哈希索引)是MySQL索引的自优化算法之一,其主要的作用是将热索引的内存地址生成hash表,保存在内存中,当SQL语句调用到该索引时,可以直接找到该页(不需要从根节点-->枝节点-->叶节点)。

AHI 在实现上就是一个哈希表:从某个检索条件到某个数据页的哈希表,仿佛并不复杂,但其中的关窍在于哈希表不能太大(哈希表维护本身就有成本,哈希表太大则成本会高于收益),又不能太小(太小则缓存命中率太低)。

①AHI 是为某个索引树建立的(当该索引树层数过多时,AHI 才能发挥效用)。
②如果某索引只被使用一两次,就为之建立 AHI,会导致 AHI 太多,维护成本高于收益。

条件一:热索引

AHI不会为所有的索引生成hash表,如果所有的索引都生成hash表,维护的成本过高。当索引被查询的次数超过一定阈值时,才有可能建立hash值。
MySQL系列-InnoDB索引优化AHI、Change buffer

条件二:热索引的热条件

AHI也不会为一个索引的所有数据建立hash值,当被查询的条件数据出现次数达到一定阈值时,才会建立hash值。
MySQL系列-InnoDB索引优化AHI、Change buffer
MySQL系列-InnoDB索引优化AHI、Change buffer

AHI查找过程:

MySQL系列-InnoDB索引优化AHI、Change buffer

索引优化-change buffer

一般来说,我们更新、删除、添加一条记录的时候,首先会去buffer pool 寻找这条数据,假如该数据存在,那么直接更新在内存中的纪录(合适的时候会回刷)。但是要是buffer pool 不存在呢 ?MySQL 为了避免每次遇到这样的情况都会去磁盘上加载数据,于是就设计了 change buffer , 通俗地说就是先将对记录的更改操作暂时纪录在 change buffer ,待合适的时候再进行回刷回磁盘,提高更新操作的性能。

Change buffer的主要目的是将对二级索引(辅助索引)的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。所以以上说的记录,指的是二级索引(辅助索引)。

change buffer 位于 buffer pool中,默认最多能使用1/4的buffer pool空间,实际上,change buffer是系统表空间的一部分,当数据库服务器关闭时,索引更改将存储在其中。
MySQL系列-InnoDB索引优化AHI、Change buffer

当有位于change buffer 中的数据被加载到buffer pool中时,change buffer会做一个merge(合并)操作。
MySQL系列-InnoDB索引优化AHI、Change buffer

当buffer pool中有需要修改、删除的辅助索引值时,会直接在内存中修改,后续会批量写入磁盘。

默认情况下,可以通过以下命令查看那些操作插入change


buffer:
select @@innodb_change_buffering;

MySQL系列-InnoDB索引优化AHI、Change buffer

  • all

默认值:缓冲区插入,删除标记操作和清除。

  • none

不要缓冲任何操作。

  • inserts

缓冲区插入操作。

  • deletes

缓冲区删除标记操作。

  • changes

缓冲插入和删除标记操作。

  • purges

缓冲在后台发生的物理删除操作。

通过以下命令可以查看change buffer 能使用到buffer pool的大小,默认是25,即1/4


select @@innodb_change_buffer_max_size;

MySQL系列-InnoDB索引优化AHI、Change buffer

THE END

猜你喜欢

转载自blog.51cto.com/15082392/2656008
今日推荐