Как интерпретировать вывод 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 (datum)
  • index_status_mit_spam (status, 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
  • Is possible_keys индексы MySQL могут захотеть использовать и keys индексы MySQL фактически использует?
  • почему-индекс index_status_mit_spam не используется? В запросе colums имеют тот же порядок, что и в индексе...
  • почему-индекс index_datum не используется для ORDER BY?
  • как я могу оптимизировать свои табличные индексы или запрос? (Запрос выше требует до 3 секунд, имеющих около миллиона записей в таблице)

2 ответов


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

  • Is possible_keys индексы MySQL могут захотеть использовать и keys индексы, которые MySQL фактически использует? Да, это верно.

  • почему-индекс index_status_mit_spam не используется? В запросе colums имеют тот же порядок, что и в индексе. В SQL использует статистику по индексам таблицы определить, какой индекс использовать. The порядок полей в инструкции select не влияет на котором индекс для использования. По статистике индексы содержат такие сведения, как уникальность indexand другие вещи. Скорее всего, будет использовано больше индексов unqiue. Подробнее об этом читайте здесь: 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 не используется для заказа BY? MySQL будет использовать только один индекс, а не два во время запроса, поскольку использование второго индекса замедлит запрос еще больше. Чтение индекса-это не чтение таблицы. Это связано с оперативной эффективностью запроса. Вот ответы, которые могут объяснить некоторые понятия: https://dba.stackexchange.com/questions/18528/performance-difference-between-clustered-and-non-clustered-index/18531#18531 или добавление предложения limit в запрос MySQL резко замедляет его или индексы MySQL и когда их группировать. Эти ответы имеют много деталей, которые помогут вам понять индексацию MySQL.

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

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


  • possible_keys обозначает все индексы вашей таблицы (ключи или столбцы индекса)
  • MySQL optimizer решает лучший способ выполнения запроса, он может использовать любой индекс (не необходимый первичный ключ) или none
  • чтобы заставить MySQL использовать или игнорировать индекс, указанный в столбце possible_keys, используйте FORCE INDEX, USE INDEX или IGNORE INDEX запрос
  • проверьте эту ссылку -http://dev.mysql.com/doc/refman/5.1/en/index-hints.html .

    вы можете указать область подсказки индекса, добавив в подсказку предложение FOR. Это обеспечивает более точный контроль над выбором оптимизатором плана выполнения для различных этапов обработки запросов. Чтобы повлиять только на индексы, используемые, когда MySQL решает, как найти строки в таблице и как обработать соединения, используйте для соединения. Чтобы повлиять на использование индекса для сортировки или группировки строк, используйте для ORDER BY или GROUP BY. (Однако, если имеется индекс покрытия для таблица и используется для доступа к таблице, оптимизатор будет игнорировать игнорировать индекс для подсказок {ORDER BY|GROUP BY}, которые отключают этот индекс.)

  • попробуйте заставить другой индекс-проверьте эту ссылку наверняка -MySQL `Force INDEX` варианты использования?

  • понять объяснить формат вывода -http://dev.mysql.com/doc/refman/5.1/en/explain-output.html