Запрос диапазона mysql, используйте большой диапазон индекса

Структура таблицы mysql введите описание изображения здесьвведите описание изображения здесьвведите описание изображения здесьвведите описание изображения здесь

Это сбивает с толку, если использование диапазона запросов влияет на использование индекса в mysql!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2 ответа

Вот что происходит. И это на самом деле оптимизация.

При использовании вторичного ключа (например, INDEX(teacher_id)), обработка идет так:

  1. Доберитесь до индекса, который является B+Tree. В такой структуре довольно эффективно найти определенное значение (например, 1), а затем сканировать вперед (до 5000 или же 10000).
  2. Для каждой записи используйте данные для извлечения строки (SELECT *). Это использует PRIMARY KEYкопия которого находится во вторичном ключе. ПК и данные сгруппированы вместе; каждый поиск по одному значению PK эффективен (опять же, BTree), но вам нужно сделать 5000 или 10000 из них. Таким образом, стоимость (затраченное время) складывается.

"Сканирование таблицы" (т.е. без использования каких-либо INDEX) выглядит так:

  1. Начните с начала стола, пройдите дерево B + для стола (в порядке PK) до конца.
  2. Для каждой строки проверьте 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 может сканировать счетчик строк, если использовать индекс.!!!!!!!

Другие вопросы по тегам