#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.