MySQL — Почему в этом запросе не используется индекс (согласно explain)

#mysql #indexing

#mysql #индексирование

Вопрос:

Я играл с EXPLAIN и запустил его в этом простом запросе:

 EXPLAIN SELECT * FROM actions WHERE user_id = 17;
  

И был весьма удивлен, увидев этот результат:

 select_type    SIMPLE
table          actions
type           ALL
possible_keys  user_id
key            null
key_len        null
ref            null
rows           6
extra          Using where
  

Насколько я понимаю, это означает, что при поиске индекс не используется, это правильно? (На данный момент в таблице всего 6 строк, но их будет намного больше)

Определение таблицы (inpart):

 CREATE TABLE `actions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  ...
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1
  

Почему бы при этом не использовать значение ключа для user_id?

Комментарии:

1. Тот факт, что индекс не используется сейчас, не означает, что он не будет использоваться в будущем.

2. В этом случае, вероятно, быстрее просто сканировать 6 строк. Что, если вы добавите еще пару сотен строк?

3. @Karolis это не имеет особого смысла — запрос по первичному ключу использует этот индекс даже с 6 строками.

4. @Будет ли сколько строк иметь user_id = 17?

5.@Will только с 6 строками оптимизатор обычно выбирает полное сканирование. В этом случае это почти наверняка будет быстрее, поскольку вы выбираете * из таблицы, что означает, что если вы используете индекс, вам придется повторно обращаться к таблице, чтобы получить оставшиеся данные. Если вы измените свой запрос на SELECT user_id FROM actions WHERE user_id = 17; , возможно, он может использовать индекс, поскольку ему вообще не нужно смотреть на таблицу.

Ответ №1:

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

Не забывайте периодически запускать OPTIMIZE TABLE и ANALYZE TABLE, когда у вас будет более реалистичный набор данных.

Если вы считаете, что можете выполнить работу лучше, чем оптимизатор, вы можете использовать синтаксис индексной подсказки.

Комментарии:

1. Примечание: анализ таблицы не требуется для таблиц InnoDB.