Как интерпретировать вывод MySQL EXPLAIN?

Я хочу выбрать содержимое столбца text из entrytable.

EXPLAIN SELECT text
FROM entrytable
WHERE user = 'username' &&
`status` = '1' && (
    `status_spam_user` = 'no_spam'
    || (
        `status_spam_user` = 'neutral' &&
        `status_spam_system` = 'neutral'
    )
)
ORDER BY datum DESC
LIMIT 6430 , 10

В таблице есть три индекса:

  • index_user (пользователь)
  • index_datum (датум)
  • index_status_mit_spam (статус, status_spam_user, status_spam_system)

Результат ОБЪЯСНЕНИЯ:

id  select_type     table       type    possible_keys                       key         key_len     ref     rows    Extra
1   SIMPLE          entrytable  ref     index_user,index_status_mit_spam    index_user  32          const   7800    Using where; Using filesort
  • Является ли possible_keys индексами, которые MySQL может захотеть использовать, и keys индексами, которые MySQL действительно использует?
  • Почему индекс index_status_mit_spam не используется? В запросе столбцы имеют тот же порядок, что и в индексе,...
  • Почему индекс index_datum не используется для ORDER BY?
  • Как я могу оптимизировать свои табличные индексы или запрос? (Запрос выше требует до 3 секунд, имея около миллиона записей в таблице)

person R_User    schedule 03.01.2013    source источник


Ответы (2)


Отвечая на ваши вопросы:

  • Является ли possible_keys индексами, которые MySQL может захотеть использовать, и keys индексами, которые MySQL действительно использует? Да, это правильно.

  • Почему индекс index_status_mit_spam не используется? В запросе столбцы имеют тот же порядок, что и в индексе. SQL использует статистику по индексам таблицы, чтобы определить, какой индекс использовать. Порядок полей в операторе select НЕ влияет на то, какой индекс использовать. Статистика по индексам включает такую ​​информацию, как уникальность индекса и многое другое. Вероятно, будут использоваться более уникальные индексы. Подробнее об этом читайте здесь: http://dev.mysql.com/doc/innodb/1.1/en/innodb-other-changes-statistics-estimation.html или здесь:http://dev.mysql.com/doc/refman/5.0/en//myisam-index-statistics.html. Эти факторы определяют, как MySQL будет выбирать один индекс для использования. Он будет использовать только ОДИН индекс.

  • Почему индекс index_datum не используется для ORDER BY? MySQL будет использовать только один индекс, а не два во время запроса, так как использование второго индекса еще больше замедлит запрос. Чтение индекса НЕ является чтением таблицы. Это связано с эффективностью работы запроса. Вот ответы, которые могут объяснить некоторые концепции: https://dba.stackexchange.com/questions/18528/performance-difference-between-clustered-and-non-clustered-index/18531#18531 или Добавление оговорки limit в запрос MySQL значительно замедляет его или Индексы MySQL и когда их группировать. В этих ответах много деталей, которые помогут вам понять индексирование MySQL.

  • Как я могу оптимизировать свои табличные индексы или запрос? (Запрос выше требует до 3 секунд, имея около миллиона записей в таблице). Что ж, здесь есть файловая сортировка, которая, вероятно, вас замедляет. Возможно, в таблице слишком много индексов, и MySQL выбирает неправильный.

Вы должны понимать, что индексы ускоряют чтение и замедляют запись в таблицы. Поэтому простое добавление индексов не всегда является хорошей идеей. Приведенные выше ответы и указатели должны помочь вам получить четкое представление.

person Namphibian    schedule 03.01.2013

  • possible_keys обозначает все индексы вашей таблицы (ключи или индексные столбцы)
  • Оптимизатор MySQL выбирает лучший способ ВЫПОЛНИТЬ запрос, он может использовать любой индекс (не обязательно первичный ключ) или ни один
  • Чтобы заставить MySQL использовать или игнорировать индекс, указанный в столбце возможных_ключей, используйте FORCE INDEX, USE INDEX или IGNORE INDEX в своем запросе.
  • #P1# <блочная цитата> #P2#
  • Попробуйте принудительно указать другой индекс - обязательно проверьте эту ссылку - Случаи использования MySQL `FORCE INDEX`?

  • Понимать выходной формат EXPLAIN — http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

person Joddy    schedule 03.01.2013
comment
possible_keys обозначает все индексы вашей таблицы (ключи или индексные столбцы) — неверно. Он обозначает индексы, которые могут быть использованы для рассматриваемого запроса. - person Madbreaks; 16.10.2014