Bootstrap

《MYSQL实战45讲》将脏页刷进磁盘时导致的性能抖动

脏页

当修改数据时,如果数据在内存中,就会直接在内存中修改,并且将操作记录在redolog中,这时就可以直接返回了。这时这个内存中的数据页与磁盘中的数据是不同的,称为脏页

flush

Mysql将内存中的脏页刷新到磁盘称为flush

flush时机

1.当redolog 空间不足时,系统会停止所有更新操作,再把redolog的操作日志写入磁盘

2.当内存空间不足,触发了缓存淘汰机制,而被淘汰的刚好是脏页,就必须先把脏页数据对应的redolog写入磁盘

3.后台线程抽出空闲时间来刷新

4.mysql关闭的时候

1和2对性能影响较大

对于flush时机,两种明显影响性能的情况

1.当一个查询涉及太多数据,导致内存不足,需要淘汰大量脏页,由于会先将脏页刷盘,所以十分影响性能

2.redo log写满了,堵住所有更新。

缓存淘汰脏页,为什么不直接删除脏页,在访问到脏页中的数据时再从磁盘读取并执行redo log的操作?

如果这样的话,每次读取数据到内存中时,都要判断这个磁盘中的文件是不是脏页,即redolog中有没有对应的操作。

怎么控制刷脏页的速度

发现影响性能的情况不好避免,但是能通过提高刷脏页的速度来这个问题

首先可以通过设置innodb_io_capacity来告诉innodb你的电脑最大的IO能力是多少,可以设置为你电脑的IOPS。

mysql通过脏页比例(脏页数/总页数)来算出f1

通过当前日志id减去checkpoint 再通过一定算法算出f2

取f1和f2中较大的一个记为R,刷盘速度就是R%,系统就会按照R%的速度来刷脏页

连坐策略

当把一个脏页要刷进磁盘时,会判断这个脏页的邻居是否也是脏页,是的话也会一起刷盘,并且是连锁反应,这个邻居的邻居如果也是脏页,那么也会带着一起刷盘。通过innodb_flush_neighbors为1来开启这个机制,MYsql8.0默认是0.

;