什么是脏页?
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
什么是干净页?
内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
什么情况下会刷脏页?
第一种是“redo log写满了,要flush脏页” 整个系统就不能再接受更新了,所有的更新都必须堵住。
第二种是“内存不够用了,要先将脏页写到磁盘” 这种情况是常态
第三种是mysql空闲时候
第四种是mysql正常关闭时候
InnoDB 用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态:
第一种是,还没有使用的;
第二种是,使用了并且是干净页;
第三种是,使用了并且是脏页。
InnoDB 刷脏页的控制策略
innodb_io_capacity 它会告诉InnoDB你的磁盘能力 设置成磁盘的IOPS
innodb_max_dirty_pages_pct脏页比例上限,默认值是75%
Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total得到的
InnoDB的刷盘速度就是要参考这两个因素:一个是脏页比例,一个是redo log写盘速度
mysql刷脏页连坐机制
而 MySQL 中的一个机制,可能让你的查询会更慢:在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉;而且这个把“邻居”拖下水的逻辑还可以继续蔓延
使用的是SSD这类IOPS比较高的设备的话,建议把innodb_flush_neighbors的值设置成0
在 MySQL 8.0 中,innodb_flush_neighbors 参数的默认值已经是 0 了。