Я настроил свою таблицу с индексом только для done_status (done_status = INT):
Когда я использую:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Я получаю это обратно:
id select_type тип таблицы возможных_ключей ключ key_len ref строки Дополнительно 1 ПРОСТОЕ напоминание ВСЕ done_status NULL NULL NULL 5 Использование где
Но когда я выдаю эту команду:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Я получаю следующее возвращаемое:
id select_type тип таблицы возможных_ключей ключ key_len ref строки Дополнительно 1 ПРОСТОЕ напоминание ref done_status done_status 4 const 2
Это EXPLAIN
показывает мне, что он использует 5 строк, второй раз 2 строки.
Я не думаю, что индекс используется, если я правильно понял его в первый раз, он должен дать мне 3 строки. Что я делаю не так?
SHOW INDEX FROM reminder
:
Таблица Non_unique Key_name Seq_in_index Столбец_name Сортировка Количество элементов Sub_part Упакованный нуль Index_type Комментарий Index_comment напоминание 1 done_status 1 done_status A 5 NULL NULL BTREE
объяснить расширенный:
id select_type тип таблицы возможных_ключей ключ key_len ref строки, отфильтрованные Extra 1 ПРОСТОЕ напоминание ref done_status done_status 4 const 2 100.00
show warnings
не проявил ничего интересного
Ответы:
Вы неправильно понимаете, что такое поле «строки». Это число строк, которое, по оценкам mysql, необходимо прочитать, чтобы удовлетворить ваш запрос. Это значение может быть довольно неточным. Это не означает, что это число строк в результате - или фактическое количество строк, прочитанных mysql.
источник
Первое простое выполнение - это не использование индекса наверняка,
это может быть то, что information_schema.statistics в индексе не догоняет данные после некоторых операций записи, или к таблице не обращались в течение длительного времени.
как объясняю здесь: - Откуда MySQL Query Optimizer читает статистику индекса?
для второго плана выполнения кажется, что information_schema.statistics уже догоняет и решает проблему количества элементов NULL.
Следовательно, выполняется запрос в соответствии с оптимизатором индекса.
Для таблицы с небольшими строками это не имеет большого значения.
Но данные будут расти, разработчик должен всегда проверять это
и выполнять необходимые аналитические таблицы, когда количество совпадений в индексе равно нулю.
источник
Первый план выполнения не использует индекс.
Со справочного сайта MySQL :
Если в вашей таблице только 5 строк и ваш запрос выбирает 3 из них, то оптимизатор MySQL предполагает, что более эффективно сканировать всю таблицу.
источник