Je známo, že zpráva EXPLAIN je obtížně interpretovatelná. Přetížili příliš mnoho informací do několika polí. Můžete zkusit
type: index
označuje, že provádí index-scan , což znamená, že navštěvuje každý záznam v indexu.
To navštíví stejný počet záznamů jako skenování tabulky, kromě toho, že je to proti sekundárnímu indexu namísto klastrovaného (primárního) indexu.
Když vidíme type: index
, EXPLAIN zobrazuje possible_keys: NULL
což znamená, že nemůže používat žádný index pro efektivní vyhledávání. Ale také zobrazuje key: add_time
což znamená, že index, který používá pro skenování indexu, je add_time
.
Skenování indexu je způsobeno skutečností, že MySQL nedokáže sama optimalizovat výrazy nebo volání funkcí. Pokud byste se například pokusili vyhledat data s konkrétním měsícem, můžete hledat month(add_time) = 4
ale to by nepoužilo index na add_time, protože data s daným měsícem jsou v indexu roztroušena a nejsou všechna seskupena.
Možná znáte, že date(add_time)
by mělo být možné prohledávat podle indexu, ale MySQL to nevyvozuje. MySQL pouze vidí, že používáte funkci, a ani se nepokusí použít index.
Proto MySQL 5.7 zavedlo generované sloupce abychom mohli indexovat výraz, a MySQL 8.0 to ještě vylepšilo tím, že umožnilo index k definovanému pro výraz aniž bychom museli nejprve definovat vygenerovaný sloupec.