So laufen die Dinge. Warte einen Moment mit mir...
Der Optimizer möchte einen INDEX verwenden, in diesem Fall ACTI_DATE_I. Aber es will es nicht benutzen, wenn das langsamer wäre.
Plan A:Verwenden Sie den Index.
- Am Ende in den BTree-strukturierten Index greifen (wegen DESC)
- Rückwärts scannen
- Suchen Sie für jede Zeile im Index die entsprechende Zeile in den Daten. Hinweis:Der Index hat (ACTIVITY_DATE, ACTIVITY_ID), da der PRIMARY KEY implizit an jeden Sekundärschlüssel angehängt wird. Um in die "Daten" unter Verwendung des PK (ACTIVITY_ID) zu gelangen, ist eine weitere BTree-Suche, möglicherweise zufällig. Daher ist es potenziell langsam. (Aber nicht sehr langsam in Ihrem Fall.)
- Dies stoppt nach LIMIT Zeilen.
Plan B:Tabelle ignorieren
- Scannen Sie die Tabelle und erstellen Sie eine tmp-Tabelle. (Befindet sich wahrscheinlich im Arbeitsspeicher.)
- Sortieren Sie die tmp-Tabelle
- Ziehen Sie LIMIT Zeilen ab.
In Ihrem Fall (96 - 1 % von 10.000) ist es überraschend, dass der Tabellenscan ausgewählt wurde. Normalerweise liegt der Grenzwert zwischen 10 % und 30 % der Anzahl der Zeilen in der Tabelle.
ANALYZE TABLE
sollte eine Neuberechnung der Statistik verursacht haben, was könnte haben ihn davon überzeugt, mit dem anderen Plan zu gehen.
Welche MySQL-Version verwendest du? (Nein, mir sind keine Änderungen in diesem Bereich bekannt.)
Eine Sache, die Sie ausprobieren könnten:OPTIMIZE TABLE ACTIVITIES;
Dadurch wird die Tabelle neu aufgebaut, wodurch die Blöcke neu gepackt werden und zu möglicherweise führen unterschiedliche Statistiken. Wenn das hilft, würde ich es gerne wissen - da ich normalerweise sage "Tabelle optimieren ist nutzlos".