В дополнительном поле объяснения в mysql вы можете получить:
-
Using index
-
Using where; Using index
Какая разница между двумя?
Чтобы лучше объяснить мой вопрос, я буду использовать следующую таблицу:
CREATE TABLE `test` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`another_field` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO test() VALUES(),(),(),(),();
Который заканчивается содержимым вроде:
SELECT * FROM `test`;
id another_field
1 0
2 0
3 0
4 0
5 0
В моем исследовании я нашел
Почему этот запрос использует где вместо индекса?
Вывод
EXPLAIN
может иногда вводить в заблуждение.Например,
filesort
не имеет ничего общего с файлами,using where
не означает, что вы используете предложениеWHERE
, аUsing index
может отображаются в таблицах без определенного указателя.
using where
просто означает, что на таблице есть какое-то ограничивающее предложение (WHERE
илиON
), и не вся запись будет возвращена. Обратите внимание, чтоLIMIT
не считается ограничивающим предложением (хотя это может быть).
Using index
означает, что вся информация возвращается из индекса, без поиска записей в таблице. Это возможно только в том случае, если все поля, требуемые по запросу, покрываются индексом.Поскольку вы выбираете
*
, это невозможно. Поля, отличные отcategory_id
,board_id
,display
иorder
не покрываются индекс и должен быть просмотрен.
и я также нашел
https://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information
Использование индекса
Информация о столбце извлекается из таблицы, используя только информации в дереве индексов без необходимости делать дополнительный поиск чтобы прочитать фактическую строку. Эта стратегия может использоваться, когда запрос использует только столбцы, которые являются частью одного индекса.
Если столбец "Дополнительно" также говорит "Использование", это означает, что индекс используется для выполнения поиска ключевых значений. Без использования где, оптимизатор может считывать индекс, чтобы избежать чтения строк данных, но не используя его для поиска. Например, если индекс является индексом покрытия для запроса оптимизатор может сканировать его, не используя его для поиска.
Для таблиц InnoDB, которые имеют определяемый пользователем кластеризованный индекс, этот индекс может использоваться даже при использовании индекса в столбце "Дополнительно". Это тот случай, если тип index и ключ PRIMARY.
(Посмотрите на второй абзац)
Моя проблема с этим:
Во-первых: я не понял второй абзац так, как он писал.
Во-вторых:
Следующий запрос возвращает
EXPLAIN SELECT id FROM test WHERE id = 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test const PRIMARY PRIMARY 8 const 1 Using index
(Прокрутите вправо)
И этот другой запрос возвращает:
EXPLAIN SELECT id FROM test WHERE id > 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test range PRIMARY PRIMARY 8 NULL 1 Using where; Using index
(Прокрутите вправо)
Кроме того, что один запрос использует поиск диапазона, а другой использует постоянный поиск, оба запроса используют some restricting clause on the table (WHERE or ON), and not all record will be returned
.
Что означает значение Using where;
для второго запроса? и что означает тот факт, что это не первый запрос?
EXTRA
В чем разница с Using index condition; Using where
?
(Я не добавляю пример этого, потому что я не смог воспроизвести его в небольшом автономном фрагменте кода os)