Het EXPLAIN-rapport staat bekend als moeilijk te interpreteren. Ze hebben te veel informatie in een paar velden overbelast. Je zou kunnen proberen
Het type: index
geeft aan dat het een index-scan aan het doen is , wat betekent dat het elk item in de index bezoekt.
Dit bezoekt hetzelfde aantal items als een tabelscan, behalve dat het tegen een secundaire index is in plaats van de geclusterde (primaire) index.
Wanneer we type: index
. zien , EXPLAIN toont possible_keys: NULL
wat betekent dat het geen enkele index kan gebruiken om efficiënt te zoeken. Maar het toont ook key: add_time
wat betekent dat de index die het gebruikt voor de index-scan add_time
is .
De index-scan is te wijten aan het feit dat MySQL zelf expressies of functie-aanroepen niet kan optimaliseren. Als u bijvoorbeeld zou proberen te zoeken naar datums met een specifieke maand, zou u kunnen zoeken naar month(add_time) = 4
maar dat zou de index op add_time niet gebruiken omdat de datums met die maand verspreid zijn door de index, niet allemaal gegroepeerd.
Je weet misschien dat date(add_time)
zou door de index moeten kunnen worden doorzocht, maar MySQL maakt die conclusie niet. MySQL ziet alleen dat je een functie gebruikt en probeert niet eens de index te gebruiken.
Daarom introduceerde MySQL 5.7 gegenereerde kolommen om ons in staat te stellen een uitdrukking te indexeren, en MySQL 8.0 maakte het nog beter door een index naar gedefinieerd voor een uitdrukking zonder dat we eerst een gegenereerde kolom moeten definiëren.