Известно е, че докладът EXPLAIN е труден за тълкуване. Те са претоварили твърде много информация в няколко полета. Може да опитате
type: index
показва, че извършва индексно сканиране , което означава, че посещава всеки запис в индекса.
Това посещава същия брой записи като сканиране на таблица, с изключение на това, че е спрямо вторичен индекс вместо групирания (основен) индекс.
Когато видим type: index
, EXPLAIN показва possible_keys: NULL
което означава, че не може да използва никакъв индекс за ефективно търсене. Но също така показва key: add_time
което означава, че индексът, който използва за индексното сканиране, е add_time
.
Индексното сканиране се дължи на факта, че MySQL не може сам да оптимизира изрази или извиквания на функции. Например, ако се опитате да търсите дати с конкретен месец, можете да търсите month(add_time) = 4
но това няма да използва индекса на add_time, защото датите с този месец са разпръснати в индекса, а не всички групирани заедно.
Може да знаете тази date(add_time)
трябва да може да се търси по индекса, но MySQL не прави това заключение. MySQL просто вижда, че използвате функция, и дори не се опитва да използва индекса.
Ето защо MySQL 5.7 въведе генерирани колони за да ни позволи да индексираме израз, а MySQL 8.0 го направи още по-добър, като позволи индекс към определен за израз без да се изисква първо да дефинираме генерирана колона.