声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。
1.抖动
简单理解就是数据库,刚刚还好好的,突然就感觉整体性能都下降了,变的很慢呢。这就是所谓的抖动现象。
2.WAL
前面的笔记中介绍过,MYSQL数据在做UPDATE
操作的时候,会先把更新的数据放在内存中,但是并不会立刻写磁盘,而且先记在redo log
中,等合适的时候再更新到磁盘上去。
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。将脏页转变成干净页的这个过程称之为 flush;当有时候感觉数据库发生了抖动,可能就是在执行flush操作
3.什么时候发生 Flush
- 前面我们说到 会先redo log,那么当redo log存满,需要覆盖一点 redo log的时候,在覆盖之前,肯定要这部分日志,对应在内存上的内容 flush到 磁盘上,不然可能会丢失。
- 还有一种情况就是内存满了 ,也就是内存能装的 数据页已经到达极限,这个时候必须淘汰一部分数据页,如果淘汰的是“脏页”,那么就需要将脏页写到磁盘。
- 最后一种就是等数据库压力相对小的时候,也就是他“空闲一点”,这时,会进行刷数据页的操作
谈一下第二种情况: 当内存不够用的时候,需要刷InnoDB 用缓冲池(buffer pool)
里面的内存页;如果一个查询淘汰的脏页太多,会导致查询的时候变长。
4.InnoDB 刷脏页的控制策略
1.设置磁盘能力参数
innodb_io_capacity
2.关注脏页比例(Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total)
-- 脏页比例 Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total
elect 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;