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

MYSQL-Leistung langsam mit Filesort

Das Problem ist, dass MySQL beim Ausführen der Abfrage nur einen Index verwendet. Wenn Sie einen neuen Index hinzufügen, der die 3 Felder in Ihrem WHERE verwendet -Klausel findet es die Zeilen schneller.

ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);

Gemäß der MySQL-Dokumentation ORDER-BY-Optimierung :

Dies geschieht in Ihrem Fall. Als Ausgabe von EXPLAIN teilt uns mit, dass der Optimierer den Schlüssel price verwendet um die Zeilen zu finden. Allerdings ist die ORDER BY steht auf dem Feld date_updated die nicht zum Schlüssel price gehört .

Um die Zeilen schneller zu finden UND die Zeilen schneller zu sortieren, müssen Sie einen Index hinzufügen, der alle Felder enthält, die in WHERE verwendet werden und im Feld ORDER BY Klauseln:

ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);

Das für die Sortierung verwendete Feld muss an letzter Stelle im Index stehen. Es ist sinnlos, price anzugeben im Index, da die in der Abfrage verwendete Bedingung einen Wertebereich zurückgibt.

Wenn EXPLAIN immer noch zeigt, dass es Filesort verwendet, können Sie versuchen, MySQL zu zwingen, einen von Ihnen gewählten Index zu verwenden:

SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC 
LIMIT 19990, 10

Normalerweise ist es nicht notwendig, einen Index zu erzwingen, da der MySQL-Optimierer meistens die richtige Wahl trifft. Aber manchmal ist es eine schlechte Wahl oder nicht die beste Wahl. Sie müssen einige Tests durchführen, um festzustellen, ob die Leistung verbessert wird oder nicht.