Вывод EXPLAIN предполагает, что мой индекс не используется

9

Я настроил свою таблицу с индексом только для 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 не проявил ничего интересного

TasostheGreat
источник
Поверьте мне, индекс работает. Но я не вижу ничего на твоем снимке экрана - можешь ли ты сделать «показ индекса из твоей таблицы»
да отредактировал мой вопрос
пожалуйста, используйте glorify \ G для схемы и объясните результат плана, он должен быть более читабельным
ajreal
Из интереса вы можете повторить с «объяснением расширенного» и «показом предупреждений», это покажет реальный SQL-запрос, выбранный MySQL
@ajreal что такое прославить?

Ответы:

4

Вы неправильно понимаете, что такое поле «строки». Это число строк, которое, по оценкам mysql, необходимо прочитать, чтобы удовлетворить ваш запрос. Это значение может быть довольно неточным. Это не означает, что это число строк в результате - или фактическое количество строк, прочитанных mysql.


источник
Так? Где я сказал, что это делает? Что оптимизатор выбирает, зависит от этого? Индекс все еще работает.
@ajreal Это не значит, что индекс не работает. Просто оптимизатор выбирает (по его мнению) наиболее эффективный способ запроса данных. Я предположил, что OP ожидал, что столбец строк в EXPLAIN будет точным. Это не означает, что индекс не работает - просто MySQL решил не использовать его (вероятно).
1
@ajreal: я что-то упускаю в ваших очках. Столбец строк объяснения не имеет ничего общего с индексами, верно? Mysql решили не использовать индекс (возможно, все данные находятся на одной странице). Не уверен, что я понимаю вашу точку зрения? Оптимизация запросов для таблицы из 5 строк даст некоторые «странные» результаты, потому что в значительной степени не имеет значения, как вы оптимизируете.
В таком случае, кого волнует, какой индекс выберет оптимизатор? В самом индексе нет ничего плохого, потому что оптимизатору казалось, что он ему не нужен - какое это имеет значение?
3

Первое простое выполнение - это не использование индекса наверняка,
это может быть то, что information_schema.statistics в индексе не догоняет данные после некоторых операций записи, или к таблице не обращались в течение длительного времени.

как объясняю здесь: - Откуда MySQL Query Optimizer читает статистику индекса?

для второго плана выполнения кажется, что information_schema.statistics уже догоняет и решает проблему количества элементов NULL.

Следовательно, выполняется запрос в соответствии с оптимизатором индекса.

Для таблицы с небольшими строками это не имеет большого значения.
Но данные будут расти, разработчик должен всегда проверять это
и выполнять необходимые аналитические таблицы, когда количество совпадений в индексе равно нулю.

ajreal
источник
0

Первый план выполнения не использует индекс.

Со справочного сайта MySQL :

Иногда MySQL не использует индекс, даже если он доступен. Одно из обстоятельств, при которых это происходит, - это когда оптимизатор оценивает, что использование индекса потребовало бы от MySQL доступа к очень большому проценту строк в таблице. (В этом случае сканирование таблицы, вероятно, будет намного быстрее, поскольку требует меньше запросов.) Однако, если такой запрос использует LIMIT для извлечения только некоторых строк, MySQL в любом случае использует индекс, потому что он может найти намного быстрее несколько строк для возврата в результате.

Если в вашей таблице только 5 строк и ваш запрос выбирает 3 из них, то оптимизатор MySQL предполагает, что более эффективно сканировать всю таблицу.

Мэтью Саммут
источник