Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL verwendet je nach Grenzwert mit ORDER BY-Abfrage einen anderen Index

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.

  1. Am Ende in den BTree-strukturierten Index greifen (wegen DESC)
  2. Rückwärts scannen
  3. 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.)
  4. Dies stoppt nach LIMIT Zeilen.

Plan B:Tabelle ignorieren

  1. Scannen Sie die Tabelle und erstellen Sie eine tmp-Tabelle. (Befindet sich wahrscheinlich im Arbeitsspeicher.)
  2. Sortieren Sie die tmp-Tabelle
  3. 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".