你的SQL语句为什么突然变慢了?

平常工作中,一条SQL语句,正常执行的时候特别的快,但偶尔会出现“抖动”,执行的特别慢。

这是为什么呢?

总共有两种情况会导致这个问题:

1.MySQL有一个机制WAL,即Write Ahead Logging,就是说在进行写操作之前,先会往redo log里记录一条日志,然后才会进行写操作。问题就在这,redo log是在内存中的,它的大小是有限制的。也就说当它被写满的时候,MySQL必须停下手头的工作,把内存中的脏页刷新到磁盘里。而这个过程如果很长的话,就会导致某一条SQL的执行时间变长,也就出现了“抖动”。

2.当内存不够用的时候,MySQL会有个数据页淘汰机制。如果淘汰的刚好是脏页,那么这个时候就需要把脏页刷新到磁盘,这个过程会比较长,也就会导致某一条SQL的执行时间变长,出现“抖动”。

如何解决?

我们先说第二种情况。它在什么情况下的影响会比较大呢?就是当一条查询SQL要淘汰的脏页过多时,影响会比较大。那么怎么避免要淘汰的脏页过多?答案显然是减少脏页所占的比例。怎么降低?答案是控制脏页刷新的速度。

脏页刷新的速度是很有讲究的,太慢会导致脏页的堆积,太快会导致不能服务用户请求。所以怎么控制这个速度呢?可以通过设置innodb_io_capacity参数来进行设置。

你可能感兴趣的:(你的SQL语句为什么突然变慢了?)