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.