У нас недавно была проблема, которую я никогда раньше не видел, когда в течение примерно 3 часов одна из наших таблиц Mysql работала очень медленно. Эта таблица содержит сообщения на форуме, и в настоящее время в ней около миллиона строк. Запрос, который стал медленным, был очень распространенным в нашем приложении:
SELECT * FROM `posts` WHERE (`posts`.forum_id = 1) ORDER BY posts.created_at DESC LIMIT 1;
У нас есть индекс таблицы сообщений (forum_id, creation_at), который обычно позволяет выполнять этот запрос и сортировку в памяти. Но, в течение этих трех часов, не очень. То, что обычно является мгновенным запросом, варьировалось от 2 до 45 секунд в течение этого периода времени. Затем все вернулось к норме.
Я просматривал наш медленный журнал запросов, и больше ничего не выглядит необычным. Я посмотрел на New Relic (это приложение Rails), и все остальные действия выполнялись с той же скоростью, что и обычно. У нас не было необычного количества сообщений сегодня. Я не могу найти ничего более странного в наших журналах. И база данных не менялась, когда у нее все еще оставались гигабайты памяти для использования.
Мне интересно, может ли Mysql передумать о том, какие индексы использовать для данного запроса, и по какой-то причине он решил сегодня провести полное сканирование таблицы по этому запросу в течение нескольких часов? Но если бы это было правдой, почему он прекратил бы полное сканирование таблицы?
Кто-нибудь еще сталкивался с периодически медленным запросом, который игнорировал причину? Или у вас есть творческие идеи о том, как можно решить проблему, подобную этой?