MySQL SELECT IN () оператор и Индекс InnoDB терпят неудачу - PullRequest
3 голосов
/ 21 августа 2011

У меня есть запрос, который делает это:

SELECT `threaded_comments`.* FROM `threaded_comments` WHERE `threaded_comments`.`parent_id` IN (4, 5)

Я также настроил INDEX для столбца parent_id.

Когда я проверяю запрос EXPLAIN SELECT, я получаю следующую информацию:

`select_type`,`table`,`type`,`possible_keys`,`key`,`key_len`,`ref`,`rows`,`Extra`
'SIMPLE', 'threaded_comments', 'ALL', 'COMMENT_PARENT', NULL, NULL, NULL, 3, 'Using where'

Похоже, что для выражения where индекса не используются ключи. Однако, когда я делаю простой parent_id = 4, это работает. Но когда я делаю parent_id = 4 или parent_id = 5, это вызывает то же сообщение.

Я понял, что это связано с типом таблицы базы данных innoDB. MySQL, похоже, не нравится, когда на этом конкретном ядре базы данных выполняются операции IN. Может ли это быть проблемой с инструментом EXPLAIN или отсутствует InnoDB?

Ответы [ 3 ]

4 голосов
/ 21 августа 2011

Нет, это не имеет ничего общего с InnoDB.Ваш план EXPLAIN показывает, что запрос может использовать индекс, но оптимизатор MySQL решил не использовать его.Выбранное решение зависит от многих факторов.Но позже, когда ваша таблица подрастет, оптимизатор может принять другое решение, если сочтет это полезным.Если вы хотите явно использовать индекс для этого запроса, то вы можете попробовать принудительно индексировать .

1 голос
/ 21 августа 2011

Индекс не всегда является преимуществом.

Из документации :

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

В вашем случае индекс считается хорошим для parent_id = 4, но сканирование таблицы предпочтительнее для parent_id IN (4, 5)

1 голос
/ 21 августа 2011

Кажется, что у вас слишком мало строк в таблицах, и предпочтительнее полное сканирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...