12 | 为什么我的MySQL会“抖”一下?
Page content
12 | 为什么我的MySQL会“抖”一下?
SQL 语句为什么变“慢”了?
和数据相关的三个部分:数据文件、日志文件、内存
脏页:内存数据页和磁盘数据页内存不一致,这个内存页称为“脏页”
干净页:内存数据写入磁盘后,内存和磁盘上的数据页就一致了,我们称为“干净页”
平时执行很快的更新操作,其实就是在写内存和日志;偶尔变得很慢,很可能是在刷“脏页”(flush)
哪些场景下会刷脏页?
- redo log 满了
- 系统内存不足
- 系统空闲的时候,主动刷脏
- Mysql正常关闭前
刷脏是常态,但是要避免两种情况
- 一个查询要淘汰的脏页个数过多,会导致查询的响应时间明显变长
- 日志写满,更新全部堵住,写性能跌为0
InnoDB 刷脏页的控制策略
- 正确告诉 InnoDB 所在主机的IO能力,使其能够确定全力刷脏页的时候能刷多快;相关参数:
innodb_io_capacity
- 避免刷脏页的时候顺带刷旁边的脏页;相关参数:
innodb_flush_neighbors
问题讨论
一个内存配置为 128GB、innodb_io_capacity 设置为 20000 的大规格实例,正常会建议你将 redo log 设置成 4 个 1GB 的文件。
但如果你在配置的时候不慎将 redo log 设置成了 1 个 100M 的文件,会发生什么情况呢?又为什么会出现这样的情况呢?
答案 磁盘压力很小,但是数据库出现间歇性的性能下跌。