EXPLAIN-rapporten är känd för att vara svår att tolka. De har överbelastat för mycket information i några få fält. Du kan försöka
type: index
indikerar att den gör en index-skanning , vilket betyder att den besöker varje post i indexet.
Detta besöker samma antal poster som en tabellsökning, förutom att det är mot ett sekundärt index istället för det klustrade (primära) indexet.
När vi ser type: index
, EXPLAIN visar possible_keys: NULL
vilket innebär att det inte kan använda något index för att söka effektivt. Men den visar också key: add_time
vilket betyder att indexet den använder för indexsökningen är add_time
.
Indexsökningen beror på att MySQL inte kan optimera uttryck eller funktionsanrop på egen hand. Om du till exempel skulle försöka söka efter datum med en specifik månad kan du söka efter month(add_time) = 4
men det skulle inte använda indexet på add_time eftersom datumen med den månaden är utspridda i indexet, inte alla grupperade tillsammans.
Du kanske känner till det date(add_time)
bör kunna sökas av indexet, men MySQL gör inte den slutsatsen. MySQL ser bara att du använder en funktion, och den försöker inte ens använda indexet.
Det är därför MySQL 5.7 introducerade genererade kolumner för att tillåta oss att indexera ett uttryck, och MySQL 8.0 gjorde det ännu bättre genom att tillåta en index som ska definieras för ett uttryck utan att vi måste definiera en genererad kolumn först.