Я пытаюсь отладить простой, но очень медленный запрос MySQL для таблицы с JOIN к очень большой таблице (13 м строк), большая таблица имеет несколько индексов.
Объединение очень простое c, просто соединение ID из маленькой таблицы с foreign_ID в большой таблице.
В прошлом этот запрос выполнялся быстро, однако с тех пор было добавлено много новых данных. Раньше для этого требовалось 30 мс, сейчас это занимает 5 минут.
В режиме реального времени я попытался восстановить большую таблицу с помощью команды alter, чтобы установить для нее InnoDb. Но это не имело значения.
Итак, чтобы отладить запрос, я запускаю EXPLAIN и пытаюсь удалить соединения et c, пока запрос снова не будет выполнен очень быстро.
Типы объединения начинались как ALL, eq_ref, ref и ref.
Затем, когда я снова включаю объединения и пытаюсь найти способ заставить его работать Я обнаружил, что на самом деле сейчас ОРИГИНАЛЬНЫЙ ЗАПРОС снова работает быстро.
Единственное, что изменилось, - это план выполнения запроса.
Типы соединения теперь range, eq_ref, eq_ref и ref.
Что случилось? Почему MySQL теперь обрабатывает этот же запрос иначе, чем раньше?
И как я могу заставить мой живой сервер делать это тоже? И как я могу предотвратить это в будущем?
РЕДАКТИРОВАТЬ: MySQL версия на Prod и локально 5,7