2015-03-26 2 views
3

У меня действительно большой сложный запрос. Я пытаюсь оптимизировать использование MySQL EXPLAIN SELECT или EXPLAIN EXTENDED SELECT.MySQL EXPLAIN - он постоянно дает мне разные объяснения каждый раз

Если я запустил его против запроса, я увижу, что каждая таблица в запросе использует Using where в столбце Extra, что отлично.

Данные не будут изменены вообще, я уйду и сделаю чашку чая или что-то еще, вернусь и снова запустите EXPLAIN.

На этот раз, всего через несколько минут, только 20% таблиц составляют Using where, основная таблица теперь Using index; Using temporary; Using filesort, и мой день становится кошмаром, пытающимся отладить это.

Я знаю, что иногда такие вещи, как временные таблицы и файловые хранилища, более эффективны, чем использование где предложения и индексы. Но не в случае этой базы данных размером 10 ГБ, а создание временных таблиц и filesorts полностью уничтожает сервер.

Любые идеи, почему это происходит? Есть ли такая логика или причина?

+5

Кто-то добавил указатель на стол, пока вы выпили чашку кофе. –

ответ

0

Вы используете InnoDB, правильно? Вы используете версию старше 5.6.6, правильно?

Вы столкнулись с интересным вариантом отсутствия у InnoDB «постоянной статистики». Несколько вещей, используемых для запуска перерасчета статистики для таблиц InnoDB. И эти статистические данные используются для принятия решения о выполнении запроса.

Возможно, ваш конкретный запрос был «на заборе» - небольшое изменение в какой-либо статистике приведет к другому тарифному плану.

Если вы хотите, мы могли бы копать глубже. Но мы должны видеть

  • SHOW CREATE TABLE
  • SHOW TABLE STATUS (ключи размера таблицы)
  • EXPLAIN EXTENDED SELECT...
  • EXPLAIN FORMAT=JSON SELECT... (5.6.5 или более поздней версии)

И мы можем быть в состоянии предложите способы ускорения запроса.