EXPLAIN висновок говорить про те, що мій індекс не використовується


9

Я створив свою таблицю з індексом лише на done_status (done_status = INT):

введіть тут опис зображення

Коли я використовую:

EXPLAIN SELECT * FROM reminder  WHERE done_status=2

Я повертаю це:

id таблиця вибору_типу Тип таблиці можливий_кілька клавіша key_len ref рядки Extra
1 ПРОСТЕ нагадування ВСЕ done_status NULL NULL NULL 5 Використання де

Але коли я видаю цю команду:

EXPLAIN SELECT * FROM reminder  WHERE done_status=1

Я отримую таке повернення:

id таблиця вибору_типу Тип таблиці можливий_кілька клавіша key_len ref рядки Extra
1 ПРОСТЕ нагадування ref done_status done_status 4 const 2   

На EXPLAINмені показує , що він використовує 5 рядків, другий раз 2 рядки.

Я не думаю, що індекс використовується, якщо я зрозумів це правильно в перший раз, він повинен дати мені 3 ряди. Що я роблю неправильно?

SHOW INDEX FROM reminder:

Таблиця Non_unique Key_name Seq_in_index Ім'я стовпця Кардинальність зіставлення Підзапчастина Упакована Нульова індекс_тип Коментар Index_comment
нагадування 1 done_status 1 done_status A 5 NULL NULL BTREE

поясніть розширено:

ідентифікатор вибору типу типу таблиці можливий_кількість клавіша key_len ref рядки відфільтровано Extra
1 ПРОСТЕ нагадування ref done_status done_status 4 const 2 100

show warnings не виявив нічого цікавого.


Повірте, індекс працює. Але я не можу побачити що-небудь легко у твоєму екрані - чи можеш ти зробити "покажчик покажчика з вашого столу"

так, відредагував моє запитання

будь ласка, використовуйте glorify \ G для схеми та поясніть результат плану, він повинен бути більш читабельним
ajreal

З інтересу ви можете повторити з "поясненням розширеного" та "показом попереджень", це покаже фактичний вибір SQL mysql

@ajreal що прославляє?

Відповіді:


4

Ви неправильно розумієте, що таке поле "рядки". Саме кількість рядків, яку оцінює mysql, потрібно буде прочитати, щоб задовольнити ваш запит. Це значення може бути досить неточним. Це не означає, що це кількість рядків у результаті - чи фактична кількість рядків, прочитаних mysql


Тому? Де я сказав, що це робить? Що вибрати оптимізатор? Індекс все ще працює.

@ajreal Це не означає, що індекс зламаний. Просто оптимізатор вибирає (на думку) найбільш ефективний спосіб запиту даних. Я припускав, що ОП очікував, що стовпець рядків у ПОЯСНЕННІ буде точним. Це не означає, що індекс зламаний - просто той MySQL вирішить не використовувати його (напевно).

1
@ajreal: Я щось пропускаю у ваших пунктах. Стовпчик рядків пояснення не має нічого спільного з індексами, правда? Mysql вирішує не використовувати індекс (можливо, всі дані є на одній сторінці). Не впевнений, я розумію вашу думку? Оптимізація запитів у таблиці з 5 рядків дасть певні «непарні» результати, оскільки це майже не має значення, як ви оптимізуєте.


У цьому випадку кого цікавить, який індекс вибере оптимізатор? З самим індексом немає нічого поганого, адже оптимізатор відчув, що йому це не потрібно - що це має значення?

3

Перша звичайна
версія виконання не використовує індекс точно, це може бути інформація_schema.statistics для індексу не наздоганяє дані після деяких операцій запису, або таблиця не має доступу до неї тривалий час.

як тут пояснюється: - Звідки оптимізатор запитів MySQL читає статистику індексу?

для другого плану виконання, схоже, що інформація_schema.statistics вже наздогнала та виправить проблему з кардинальністю NULL.

Тому виконується запит відповідно до оптимізатора індексу.

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


0

Перший план виконання не використовує індекс.

З довідкового веб-сайту MySQL :

Іноді MySQL не використовує індекс, навіть якщо такий доступний. Однією обставиною, за якої це відбувається, є те, коли оптимізатор оцінює, що за допомогою індексу MySQL вимагатиме доступу до дуже великого відсотка рядків у таблиці. (У цьому випадку сканування таблиці, ймовірно, буде набагато швидшим, оскільки вимагає меншої кількості запитів.) Однак, якщо такий запит використовує LIMIT для отримання лише деяких рядків, MySQL все одно використовує індекс, тому що він може набагато швидше знайти кілька рядків, щоб повернути результат.

Якщо у вашій таблиці є лише 5 рядків, а ваш запит вибирає 3 з них, оптимізатор MySQL припускає, що ефективніше сканувати всю таблицю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.