文章目录
一、新名词
1. “脏页”
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
2.“干净页”
内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
3. flush
内存里的数据写入磁盘的过程
二、新参数
1. innodb_io_capacity
InnoDB 的磁盘能力
这个值建议设置成磁盘的IOPS。磁盘的IOPS可以通过fio这个工具来测试,下面的语句是用来测试磁盘随机读写的命令:
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
2. innodb_max_dirty_pages_pct
脏页比例上限,默认值是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;
3. innodb_flush_neighbors
用来控制刷一个脏页时是否把邻居的脏页一起刷掉。
- 值为1的时候表示会一起刷。
- 值为0时表示不找邻居,自己刷自己的。
三、新知识点
1. 什么情况会引发数据库的flush过程?
- InnoDB的redo log写满了。这时候系统会停止所有更新操作,把checkpoint往前推进,redo log留出空间可以继续写。
- 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘。
- MySQL认为系统“空闲”的时候。
- MySQL正常关闭的情况。这时候,MySQL会把内存的脏页都flush到磁盘上,这样下次MySQL启动的时候,就可以直接从磁盘上读数据,启动速度会很快。
2. 刷脏页对性能的影响
- 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长;
- 日志写满,更新全部堵住,写性能跌为0,这种情况对敏感业务来说,是不能接受的。
3. 刷脏页写盘
刷脏页一定会写盘,就保证了每个数据页有两种状态:
- 内存里存在,内存里就肯定是正确的结果,直接返回;
- 另一种是内存里没有数据,就可以肯定数据文件上是正确的结果,读入内存后返回。
这样的效率最高。
4. 内存页的三种状态
InnoDB用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态:
- 第一种是,还没有使用的;
- 第二种是,使用了并且是干净页;
- 第三种是,使用了并且是脏页。