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

MySQL:Warum ändert die 5. ID in der IN-Klausel den Abfrageplan drastisch?

Wie Sie gezeigt haben, hat MySQL zwei alternative Abfragepläne für Abfragen mit ORDER BY ... LIMIT n :

  1. Lesen Sie alle qualifizierten Zeilen, sortieren Sie sie und wählen Sie die n aus oberen Reihen.
  2. Lies die Zeilen in sortierter Reihenfolge und höre auf, wenn n Es wurden geeignete Zeilen gefunden.

Um zu entscheiden, welche die bessere Option ist, muss der Optimierer die Filterwirkung Ihrer WHERE-Bedingung schätzen. Dies ist nicht einfach, insbesondere für Spalten, die nicht indiziert sind, oder für Spalten, in denen Werte korreliert sind. In Ihrem Fall muss man wahrscheinlich viel mehr von der Tabelle in sortierter Reihenfolge lesen, um die ersten 25 qualifizierten Zeilen zu finden, als der Optimierer erwartet hat.

Es gab mehrere Verbesserungen bei der Behandlung von LIMIT-Abfragen, sowohl in späteren Versionen von 5.6 (Sie verwenden eine Pre-GA-Version!) als auch in neueren Versionen (5.7, 8.0). Ich schlage vor, dass Sie versuchen, auf eine neuere Version zu aktualisieren, und prüfen, ob das Problem immer noch besteht.

Wenn Sie die Entscheidungen des Abfrageplaners nachvollziehen möchten, sollten Sie sich im Allgemeinen die Ablaufverfolgung des Optimierers für die Abfrage ansehen.