MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 30 讲/共 41 讲
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

28|InnoDB Buffer Pool如何提高数据库性能?(下)

你好,我是俊达。
上一讲的思考题中,我留了一个问题,就是删除表或索引时,表或索引已经缓存在 Buffer Pool 中的数据要怎么处理。实际上处理的方式跟表的类型(是普通表还是临时表,是否使用 per-table)以及操作类型有关,还跟 MySQL 的版本有关,这一讲我会对这些情况做一些分析。
InnoDB 还使用了自适应 Hash 索引(Adaptive Hash Index,AHI)、Change Buffer、Double Write Buffer,来提升性能或数据的可靠性,这一讲中我也会分别进行介绍。

DDL 和 Buffer Pool

删除表(DROP Table/Truncate Table)

我们先来看一下 DROP 一个使用独立表空间(innodb_file_per_table=ON)的普通表时,InnoDB 内部需要做哪些处理。
首先要将 AHI 中,跟这个表相关的索引条目清理掉。上一讲中我们提到过,每一个页面的控制块中,有一个 AHI 结构。如果一个索引页面缓存在 AHI 中,那么控制块的 ahi.index 中会指向这个索引。索引在内存中还维护了一个 search_info 结构,里面记录了索引中有多少个页面缓存到了 AHI 中。如果被删除的表,确实有页面缓存在 AHI 中,那么就要扫描每个 Buffer 实例的 LRU 链表,检查每个页面是不是存在和正在删除的这个表相关的 AHI 条目。如果有,先将页面添加到一个临时数组中,临时数组中的页面达到一定数量时,再批量清理这些页面相关的 AHI 条目。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. InnoDB在执行DDL操作时,如删除表或索引,需要清理相关的AHI条目和处理表空间和ibd文件,可能对高并发环境下的业务系统造成影响,建议在业务低峰期执行DDL操作。 2. 自适应Hash索引(AHI)是InnoDB用来提升查询性能的方法,通过自动识别热点块并建立Hash索引来提高查询性能,但开启AHI会带来一定的开销,需要根据实际测试确定是否能提升数据库整体性能。 3. AHI的建立是基于索引访问模式的相关信息,当多次访问一个索引时,访问模式一致且访问次数超过一定阈值时,会给当前页面建立hash索引。 4. 8.0.23版本对删除表空间的操作进行了优化,不再需要扫描Flush链表,而是只需增加表空间的版本号,减少了对性能的影响。 5. 在删除索引时,需要清理相关的AHI条目,并回收索引占用的空间,同时不需要特殊处理Buffer Pool中的脏页,因为表空间还在,脏页会被后台线程自动刷新。 6. 8.0.23版本对回收临时表的操作进行了优化,不再需要将临时表的页面从LRU和Flush链表中移走,减少了对性能的影响。 7. Change Buffer用于优化数据写入性能,特别针对非唯一索引,而Double Write Buffer用于保障数据可靠性,避免数据页写入不一致的情况。 8. MySQL 8.4中默认关闭了Change Buffer和自适应Hash索引,可能是由于SSD磁盘的大量使用,减少了Change Buffer的重要性。关闭这些功能可能会对性能产生影响,需要进行性能测试来评估对应用的影响。 9. 建议在业务低峰期执行DDL操作,因为执行这些操作可能对业务系统造成明显的影响,特别是在高并发的环境下。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部