Mysql抖了一下

SQL语句执行速度突然变慢可能由redolog满需flush、内存页淘汰及脏页flush联动引起。redolog满时会导致更新操作阻塞;内存满则需淘汰脏页,可能影响性能;脏页flush可能会连锁相邻页。配置innodb_flush_neighbors可优化SSD环境下的刷盘行为。
摘要由CSDN通过智能技术生成

平时的工作中, 一条SQL语句, 正常执行的时候特别快, 但是有时也不知道怎么回事, 它就会变得特别慢, 并且这样的场景很难复现, 它不只随机, 而且持续时间还很短。

就像mysql抖了一下。这种情况可能的原因有哪些呢?
 

1、redo log 满了,需要flush到磁盘中,checkpoint后移。此时系统所有更新操作都会阻塞住。

一般来说,我们的redo log是由4个文件组成的,每个文件写满会自动写到下一个文件,最后一个文件写满,会自动跳回第一个文件。mysql会记录当前写入文件的位置,记为write pos,而同时也需要将redo log写盘,此时flush的位置记为checkpoint.如图。

 当write pos 追上checkpoint 的时候,我们无法再往redo log 中写入数据,需要先flush,将checkpoint往后移动,才能继续写入数据。redo log 无法写入数据,那么所有的修改数据操作都不可执行。所以mysql会抖一下。

2、内存满了,必须要淘汰部分数据页。如果数据页是脏页,需要flush变成干净页才能使用。

这个很好理解,mysql所有的操作都是在内存中操作的,当内存页都已经被使用,必须先将部分内存页flush到磁盘中释放出来,才可以继续下面的操作。

3、内存脏页flush联动。

如果刷当前脏页后,发现相邻的页也是脏页,那么就会把相邻的内存页也刷掉,且会一直联动直到相邻页不是脏页。可以配置 innodb_flush_neighbors=0,表示自己刷自己,不刷相邻脏页。这个设置在磁盘是SSD下是很有效的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值