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

Warum ist MySQL langsam, wenn ich LIMIT in meiner Abfrage verwende?

Indizes verbessern nicht unbedingt die Leistung. Um besser zu verstehen, was passiert, wäre es hilfreich, wenn Sie explain einfügen würden für die verschiedenen Abfragen.

Meine beste Vermutung wäre, dass Sie einen Index in id_state haben oder sogar id_state, id_mp das verwendet werden kann, um das where zu erfüllen Klausel. Wenn ja, die erste Abfrage ohne den order by würde diesen Index verwenden. Es sollte ziemlich schnell gehen. Auch ohne Index erfordert dies ein sequentielles Scannen der Seiten in den orders Tabelle, die immer noch ziemlich schnell sein kann.

Dann, wenn Sie den Index am creation_date hinzufügen , entscheidet sich MySQL dafür, diesen Index stattdessen für die order by zu verwenden . Dazu muss jede Zeile im Index gelesen und dann die entsprechende Datenseite abgerufen werden, um das where zu überprüfen Bedingungen und geben die Spalten zurück (falls es eine Übereinstimmung gibt). Dieses Lesen ist höchst ineffizient, weil es nicht in der "Seiten"-Reihenfolge erfolgt, sondern wie durch den Index angegeben. Zufällige Lesevorgänge können ziemlich ineffizient sein.

Schlimmer noch, obwohl Sie ein limit haben , müssen Sie noch ganz lesen Tabelle, da die gesamte Ergebnismenge benötigt wird. Obwohl Sie eine Sortierung von 38 Datensätzen gespeichert haben, haben Sie eine massiv ineffiziente Abfrage erstellt.

Übrigens wird diese Situation deutlich schlimmer, wenn der orders Tabelle passt nicht in den verfügbaren Speicher. Dann haben Sie eine Bedingung namens "Thrashing", bei der jeder neue Datensatz dazu neigt, einen neuen I/O-Lesevorgang zu generieren. Wenn also eine Seite 100 Datensätze enthält, muss die Seite möglicherweise 100 Mal gelesen werden.

Sie können all diese Abfragen beschleunigen, indem Sie einen Index für orders(id_state, id_mp, creation_date) haben . Das where -Klausel verwendet die ersten beiden Spalten und den order by wird die letzte verwenden.