Ich habe einen großen Tisch mit 22 Millionen Datensätzen. Ich möchte die nächste Abfrage ausführen:
%Vor%Um die Leistung zu verbessern, habe ich den BTREE-Index für das Feld endData hinzugefügt:
%Vor%Nachdem ich mit der Analyse des Abfrageausführungsplans begonnen habe:
Wenn ich Parameter von 15 bis 7 Tagen vorher bekommen möchte:
%Vor%Ich habe den nächsten Ausführungsplan, um 2.762.088 Zeilen zu verarbeiten.
%Vor%Wenn ich das Intervall um einen Tag vergrößere, erhielt ich:
%Vor%EXPLAIN sagte, dass MySQL plant, alle 22.923.126 Zeilen zu verarbeiten.
%Vor%Wählen Sie zum Beispiel ohne Bedingungen im WHERE-Prozess 22.925.642.
Darf ich den Ausführungsplan verbessern? Vielleicht habe ich irgendwo einen Fehler oder ist normales MySQL-Verhalten?
Wenn die Ergebnismenge 8-9% aller Zeilen überschreitet, führt MySQL einen vollständigen Tabellenscan durch. Für mich sieht es so aus, als würde man eines Tages MySQL in voller Tabellenscanrichtung hinzufügen. Sie könnten versuchen, den Index zu erzwingen, um zu sehen, ob das Ergebnis besser ist.
UPDATE:
Nach dem, was ich gelesen habe, tendiert der MySQL-Abfrageoptimierer in Grenzfällen wie diesem dazu, falsch zu wählen, so dass es leicht funktionieren könnte, einen Index zu erzwingen. Ansonsten ist dies eine einfache Abfrage, und ich habe nicht viel mehr Platz für die Optimierung.
Vielleicht könnte die Erstellung eines Covering-Index für diese beiden Spalten und die Erzwingung ihrer Verwendung die besten Ergebnisse liefern. p>
Tags und Links mysql performance database-performance sqldatetime database-indexes