Запрос диапазона mysql, используйте большой диапазон индекса
Структура таблицы mysql
Это сбивает с толку, если использование диапазона запросов влияет на использование индекса в mysql!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2 ответа
Вот что происходит. И это на самом деле оптимизация.
При использовании вторичного ключа (например, INDEX(teacher_id)
), обработка идет так:
- Доберитесь до индекса, который является B+Tree. В такой структуре довольно эффективно найти определенное значение (например,
1
), а затем сканировать вперед (до5000
или же10000
). - Для каждой записи используйте данные для извлечения строки (
SELECT *
). Это используетPRIMARY KEY
копия которого находится во вторичном ключе. ПК и данные сгруппированы вместе; каждый поиск по одному значению PK эффективен (опять же, BTree), но вам нужно сделать 5000 или 10000 из них. Таким образом, стоимость (затраченное время) складывается.
"Сканирование таблицы" (т.е. без использования каких-либо INDEX
) выглядит так:
- Начните с начала стола, пройдите дерево B + для стола (в порядке PK) до конца.
- Для каждой строки проверьте
WHERE
пункт (диапазон наteacher_id
).
Если необходимо просмотреть более 20% таблицы, сканирование таблицы на самом деле происходит быстрее, чем отскок назад и вперед между вторичным индексом и данными.
Таким образом, "большой" составляет около 20%. Фактическое значение зависит от статистики таблицы и т. Д.
Итог: просто позвольте Оптимизатору делать свое дело; большую часть времени это знает лучше всего.
Вкратце, я использую базу данных mysql
EXPLAIN
SELECT * FROM t_teacher_course_info
WHERE teacher_id >1 and teacher_id < 5000
будет использовать индекс INDEX `idx_teacher_id_last_update_time` (`teacher_id`, `last_update_time`)
но если изменить диапазон
EXPLAIN
SELECT * FROM t_teacher_course_info
WHERE teacher_id >1 and teacher_id < 10000
id select_type тип таблицы возможных_ключей ключ key_len ref строки Дополнительно
1 1 ПРОСТОЕ t_teacher_course_info ВСЕ idx_teacher_update_time 671082 Использование где
сканировать всю таблицу, не использовать индекс, любая конфигурация mysql может сканировать счетчик строк, если использовать индекс.!!!!!!!