В чем разница между "Использовать индекс" и "Использовать где, используя индекс" в EXPLAIN
В дополнительном поле объяснения в 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
не покрываются индекс и должен быть просмотрен.
и я также нашел
Использование индекса
Информация о столбце извлекается из таблицы, используя только информации в дереве индексов без необходимости делать дополнительный поиск чтобы прочитать фактическую строку. Эта стратегия может использоваться, когда запрос использует только столбцы, которые являются частью одного индекса.
Если столбец "Дополнительно" также говорит "Использование", это означает, что индекс используется для выполнения поиска ключевых значений. Без использования где, оптимизатор может считывать индекс, чтобы избежать чтения строк данных, но не используя его для поиска. Например, если индекс является индексом покрытия для запроса оптимизатор может сканировать его, не используя его для поиска.
Для таблиц 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)
Ответы
Ответ 1
Когда вы видите Using Index
в дополнительной части объяснения, это означает, что индекс запроса (покрытия) подходит для запроса.
В вашем примере: SELECT id FROM test WHERE id = 5;
серверу не требуется доступ к фактической таблице, поскольку он может удовлетворить запрос (вы получаете доступ только к id
), только используя индекс (как объясняет объяснение). Если вы не знаете, что ПК реализуется через уникальный индекс.
Когда вы видите Using Index; Using where
, это означает, что сначала индекс используется для извлечения записей (фактический доступ к таблице не нужен), а затем поверх этого результата устанавливается фильтрация предложения where. < ш > В этом примере: SELECT id FROM test WHERE id > 5;
вы по-прежнему извлекаете идентификатор из индекса и затем применяете условие больше, чем для фильтрации записей, не соответствующих условию