У нас недавно была проблема, которую я никогда раньше не видел, где около 3 часов одна из наших таблиц Mysql была чрезвычайно медленной. Эта таблица содержит сообщения на форуме и в настоящее время содержит около миллиона строк. Запрос, который стал медленно был очень распространенным в нашем приложении:Периодически медленный стол Mysql - почему?
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 передумать, какие индексы использовать для заданного запроса, и по какой-то причине он решил решить полное сканирование таблицы по этому запросу в течение нескольких часов сегодня? Но если бы это было так, почему бы он прекратил выполнять полное сканирование таблицы?
Неужели кто-нибудь еще сталкивался с периодически прерывистым запросом, который игнорировал разум? Или у вас есть какие-то творческие идеи о том, как можно было бы отлаживать такую проблему?