《第12讲为什么我的MySQL会“抖”一下》读书笔记

在我们执行sql的时候偶尔会抖一下的原因:数据库对脏页进行了flush操作。

脏页:当内存数据页跟磁盘数据页不一样的时候,就叫脏页。

干净页:当内存数据页跟磁盘数据一样的时候,叫干净页。

mysql flush四种场景:

1.当redo log的内存片(粉版)已经记录满,这个时候会停止所有的更新操作,对checkpoint往前推,推进的日志对应的所有脏页将flush进磁盘。

2.当内存用完,这个时候需要淘汰部分数据,如果刚好淘汰的是脏页,那么会直接flush后再淘汰。

3.当空闲时,会进行flush。

4.当正常关闭mysql。

innodb_io_capacity设置问题

innodb_io_capacity告诉mysql io的处理能力,如果innodb_io_capacity设置过小,mysql刷脏页的速度就很慢,甚至小于生成的速度,导致了查询和更新新能差。

合理地设置innodb_io_capacity的值,并且平时要多关注脏页比例,不要让它经常接近75%

其中,脏页比例是通过Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total得到的,具体的命令参考下面的代码:

mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;

一旦一个查询请求需要在执行过程中先flush掉一个脏页时,这个查询就可能要比平时慢了。而MySQL中的一个机制,可能让你的查询会更慢:在准备刷一个脏页的时候,如果这个数据页旁边的数据页刚好是脏页,就会把这个“邻居”也带着一起刷掉;而且这个把“邻居”拖下水的逻辑还可以继续蔓延,也就是对于每个邻居数据页,如果跟它相邻的数据页也还是脏页的话,也会被放到一起刷。

在InnoDB中,innodb_flush_neighbors 参数就是用来控制这个行为的,值为1的时候会有上述的“连坐”机制,值为0时表示不找邻居,自己刷自己的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章