Wiadomo, że raport EXPLAIN jest trudny do interpretacji. Przeładowali zbyt wiele informacji w kilku polach. Możesz spróbować
type: index
wskazuje, że wykonuje skanowanie indeksu , co oznacza, że odwiedza każdy wpis w indeksie.
Odwiedza tę samą liczbę wpisów co skanowanie tabeli, z wyjątkiem tego, że dotyczy to indeksu pomocniczego zamiast indeksu klastrowego (podstawowego).
Gdy widzimy type: index
, EXPLAIN pokazuje possible_keys: NULL
co oznacza, że nie może używać żadnego indeksu do efektywnego wyszukiwania. Ale pokazuje też key: add_time
co oznacza, że indeks używany do skanowania indeksów to add_time
.
Skanowanie indeksów wynika z faktu, że MySQL nie może sam zoptymalizować wyrażeń lub wywołań funkcji. Na przykład, jeśli chcesz wyszukać daty z określonym miesiącem, możesz wyszukać month(add_time) = 4
ale to nie spowodowałoby użycia indeksu w add_time, ponieważ daty z tym miesiącem są rozrzucone po indeksie, a nie wszystkie zgrupowane razem.
Być może wiesz, że date(add_time)
powinien być możliwy do przeszukiwania według indeksu, ale MySQL nie robi tego wnioskowania. MySQL po prostu widzi, że używasz funkcji i nawet nie próbuje użyć indeksu.
Dlatego MySQL 5.7 wprowadził wygenerowane kolumny aby umożliwić nam indeksowanie wyrażenia, a MySQL 8.0 jeszcze go ulepszył, zezwalając na indeks zdefiniowany dla wyrażenia bez konieczności wcześniejszego zdefiniowania wygenerowanej kolumny.