2015-03-27 2 views
0

Я пытаюсь понять, почему MySQL не использует полный индекс для ответа на запрос. Позволь мне объяснить. Я использую базу данных imdb через MySQL версии 5.1.73-1 (Debian). Я создал и индексировал «itid_inf25_mid_ndx» в таблице movie_info_idx со столбцами (info_type_id, info (25), movie_id). Столбцы info_type_id и movie_id являются целыми (NOT NULL), а информация - тиком TEXT, поэтому каждая запись индекса занимает 4 + 27 + 4 = 35 байт. Выход для предложения:Почему оптимизатор mysql не использует полный индекс?

EXPLAIN 
SELECT movie_id 
FROM movie_info_idx 
WHERE info_type_id = 101 
AND info > "9"; 

показывает эти значения:

SELECT_TYPE = SIMPLE; table = movie_info_idx; тип = диапазон; possible_keys = itid_inf25_mid_ndx; key = itid_inf25_mid_ndx; key_len = 31; ref = NULL; rows = 841; Extra = «Использование где»

В key_len колонки и нет «используя индекса» в колонке дополнительные информирует, что только столбцы (info_type_id, информация (25)), сумма которых до 4 + 27 = 31 байт используются из индекс. Интересно, почему оптимизатор не использует столбец movie_id из индекса, чтобы получить доступ к movie_id в предложении SELECT? Похоже, что оптимизатор получит доступ к базовой таблице movie_info_idx, чтобы взять значение movie_id, которое я хочу перечислить. Зачем?.

Заранее благодарю вас за ваш ответ.

ответ

1

После того, как MySQL использует запрос для «сканирования диапазона» (соответствующий нескольким значениям), он больше не будет последним пользователем.

Причина в том, что индексы с несколькими столбцами являются деревом деревьев. Чтобы сканировать индекс в последнем столбце (movie_id), он должен искать дерево индексов для каждого подходящего значения столбца диапазона (info). Это обычно неэффективно, и поэтому MySQL этого не сделает.

Чтобы улучшить ситуацию, поставить колонку, как ожидается, будет сканирование диапазона в прошлом, так что порядок его как (info_type_id, movie_id, информация)

Больше информации: https://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html

+0

Спасибо вам Трента, но запрос не использует третий столбец для фильтрации строк. Mysql будет использовать индекс для извлечения записей с помощью info_type_id = 101, это определяет срез индекса. Затем срез можно сузить, беря записи со значениями, имеющими информацию> «9», и это можно сделать, потому что информация является вторым столбцом в индексе (если вы помещаете информацию в третий столбец, mysql не сможет ее использовать чтобы сократить ломтик). После извлечения финального фрагмента (101,> «9», *) все необходимые файлы movie_id находятся в этом срезе индекса, но процессор идет в таблицу, чтобы получить их. Почему ?. –

+0

Ах да, извините, однако ответ в основном такой же. После сканирования диапазона, MySQL обычно не будет использовать следующий столбец в индексе. На самом деле это может быть так же эффективно (на самом деле не уверен), но MySQL, как правило, этого не делает. –

+0

О, это убедительный ответ. Спасибо за Ваш интерес. –

Смежные вопросы