Der EXPLAIN-Bericht ist bekanntermaßen schwer zu interpretieren. Sie haben zu viele Informationen in ein paar Felder überladen. Versuchen Sie es mit
Der type: index
zeigt an, dass es einen Index-Scan durchführt , was bedeutet, dass jeder Eintrag im Index besucht wird.
Dies besucht die gleiche Anzahl von Einträgen wie ein Tabellen-Scan, außer dass es gegen einen sekundären Index statt gegen den geclusterten (primären) Index geht.
Wenn wir type: index
sehen , EXPLAIN zeigt possible_keys: NULL
was bedeutet, dass es keinen Index für eine effiziente Suche verwenden kann. Aber es zeigt auch key: add_time
was bedeutet, dass der Index, der für den Index-Scan verwendet wird, add_time
ist .
Der Index-Scan ist darauf zurückzuführen, dass MySQL Ausdrücke oder Funktionsaufrufe nicht selbst optimieren kann. Wenn Sie beispielsweise versuchen, nach Daten mit einem bestimmten Monat zu suchen, könnten Sie nach month(add_time) = 4
suchen aber das würde den Index auf add_time nicht verwenden, weil die Daten mit diesem Monat über den Index verstreut sind, nicht alle zusammen gruppiert.
Vielleicht kennen Sie dieses date(add_time)
sollte über den Index durchsucht werden können, aber MySQL zieht diesen Schluss nicht. MySQL sieht nur, dass Sie eine Funktion verwenden, und versucht nicht einmal, den Index zu verwenden.
Aus diesem Grund hat MySQL 5.7 generierte Spalten um uns zu erlauben, einen Ausdruck zu indizieren, und MySQL 8.0 hat es sogar noch besser gemacht, indem es einen Index für einen Ausdruck definiert ohne dass wir zuerst eine generierte Spalte definieren müssen.