数据页相比大家都不默认,之前介绍mysql的时候,给大家说过,读数据都是从内存中读取的。而数据库中的表以什么形式存在内存中呢,就是数据页的形式。
不知道大家有没有遇到这种情况,之前都是好好的,突然就变慢了。这种情况可能就是数据库正在刷脏页。什么是脏页呢。就是如果内存的数据和磁盘的一样。我们称只为干净页。但是如果内存数据和磁盘不一致,我们称之为脏页。为什么会出现脏页呢(直接介绍过,就是你的操作都是写到内存里的,然后就会出现脏页)。
1.就是redo log满的时候,数据库会刷一部分脏页到磁盘上,同时消除一部分redo log日志
2.还有就是内存满的时候,你想申请数据页,但是已经没有空间了。
3.就是数据库空闲的时候
4.就是数据库服务关闭的时候
后两种不用说了,是不会影响性能的,只有前两种会影响性能。那么怎么解决呢。参考下面的解决方案
设置innodb_io_capacity参数,这个就是刷脏页的参数。这个参数设置需要参考你计算机的能力。
然后innodb_max_dirty_pages_pct根据这个脏页比例,通过一定的算法算出一个树x,然后根据正在写入的redo log日志序号,和checkpoint之间的差值n,算出另一个值y,然后取xy之间的最大值r,然后根据计算的配置,确定刷脏页的最大速度,乘以R%,设置为刷脏页的速度。
连坐是不是听起来像古代的诛九族。事实上差不多。就是刷脏页的时候,如果这个脏页相邻的数据页也是脏页,就会一起给刷了。innodb_flush_neighbors这个参数就是控制这个连坐制的,1代表连坐。0代表只刷自己的。
这个主要是机械键盘时代,随机读取很消耗性能,所有才有这个设置。而如果使用的是 SSD 这类 IOPS 比较高的设备的话,我就建议你把 innodb_flush_neighbors 的值设置成 0。因为这时候 IOPS 往往不是瓶颈。
突然出现的操作数据库很慢,很有可能就是正在刷脏页。这个时候你就需要考虑怎么合理的设置这个刷脏页的速度。然后其实我有个疑惑。既然 SSD 这类 IOPS 比较高的设备随机读取不是性能的瓶颈,那么是不是意味这个b+树可以换成b树呢(有知道的可以评论区解答下)。