我们最近遇到了一个我以前从未见过的问题,大约 3 个小时,我们的一个 Mysql 表变得非常慢。该表包含论坛帖子,目前大约有 100 万行。变慢的查询在我们的应用程序中很常见:
SELECT * FROM `posts` WHERE (`posts`.forum_id = 1) ORDER BY posts.created_at DESC LIMIT 1;
我们在 (forum_id, created_at) 上的帖子表上有一个索引,通常允许此查询和排序在内存中进行。但是,在这三个小时内,并不多。在此期间,通常瞬时查询的范围从 2 秒到 45 秒不等。然后又恢复正常了。
我仔细研究了我们的慢查询日志,没有其他任何异常。我查看了 New Relic(这是一个 Rails 应用程序),所有其他操作的运行速度基本上与正常速度相同。我们今天没有异常数量的消息帖子。我在我们的日志中找不到其他奇怪的东西。并且数据库没有交换,当它仍然有可用的内存可用时。
我想知道 Mysql 是否可以来回改变对给定查询使用哪些索引的想法,并且出于某种原因,它今天开始决定对这个查询进行几个小时的全表扫描?但如果这是真的,为什么它会停止进行全表扫描呢?
有没有其他人遇到过无视原因的间歇性缓慢查询?或者你对如何调试这样的问题有什么创造性的想法吗?