Странное использование индекса в Mysql - PullRequest
3 голосов
/ 05 апреля 2010
Explain
SELECT `feed_objects`.*
FROM `feed_objects`
WHERE (`feed_objects`.feed_id IN
  ( 165,160,159,158,157,153,152,151,150,149,148,147,129,128,127,126,125,124,122,
    121, 120,119,118,117,116,115,114,113,111,110)) ;

+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | feed_objects | ALL  | by_feed_id    | NULL | NULL    | NULL |  188 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+

Неиспользуемый индекс by_feed_id


Но когда я указываю меньше значений в WHERE - все работает правильно

Explain
SELECT `feed_objects`.*
FROM `feed_objects`
WHERE (`feed_objects`.feed_id IN
  (165,160,159,158,157,153,152,151,150,149,148,147,129,128,127,125,124)) ;

+----+-------------+--------------+-------+---------------+------------+---------+------+------+-------------+
| id | select_type | table        | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+----+-------------+--------------+-------+---------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | feed_objects | range | by_feed_id    | by_feed_id | 9       | NULL |   18 | Using where |
+----+-------------+--------------+-------+---------------+------------+---------+------+------+-------------+

Используемый индекс by_feed_id


В чем проблема?

1 Ответ

6 голосов
/ 05 апреля 2010

Оптимизатор MySQL принимает множество решений, которые иногда выглядят странно. В данном конкретном случае я считаю, что у вас есть очень маленькая таблица (всего 188 строк по взглядам первого EXPLAIN), и это влияет на решение оптимизатора.

Страницы справочника " Как MySQL использует индексы " предлагают этот фрагмент информации:

Иногда MySQL не использует индекс, даже если один доступен. Один обстоятельства, при которых это происходит когда оптимизатор оценивает, что использование индекса потребует от MySQL получить доступ к очень большой процент строки в таблице. (В этом случае Сканирование таблицы, вероятно, будет намного быстрее потому что это требует меньше поисков.)

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

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

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