你的 SQL 语句为什么变“慢”了
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
MySQL 偶尔“抖”一下的那个瞬间,可能就是在刷脏页(flush)。
- 第一种场景,redo log 写满了。这时候系统会停止所有更新操作,把 checkpoint 往前推进,对应的所有脏页都 flush 到磁盘上。
- 第二种场景,系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘。
- 第三种场景,认为系统“空闲”的时候,只要有机会就刷一点“脏页”。
- 第四种场景, MySQL 正常关闭的情况,把内存的脏页都 flush 到磁盘上。
你要正确地告诉 InnoDB 所在主机的 IO 能力,这样 InnoDB 才能知道需要全力刷脏页的时候,可以刷多快。
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
然后设置 innodb_io_capacity的值。
平时要多关注脏页比例,不要让它经常接近 75%。
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;
网友评论