Tatsächlich können Sie diese Abfrage nicht optimieren.
Sie sortieren das Ergebnis anhand eines berechneten Werts, sodass Sie keinen Index verwenden können. Wenn Sie explain
verwenden Sie können sehen, wie Ihre Abfrage ausgeführt wird, und using temporary
verwenden wird im extra
vorhanden sein -Spalte, was bedeutet, dass alle Daten Ihrer Abfrage in einer temporären Tabelle gespeichert werden, in der die Bestellung durchgeführt wird.
Es spielt keine Rolle, ob Sie nur die ersten 50 Übereinstimmungen in der Abfrage haben möchten, sie muss zuerst alle Daten abrufen, sie in eine temporäre Tabelle ausgeben, das Ergebnis in dieser Tabelle sortieren und Ihnen dann die ersten 50 Übereinstimmungen zurückgeben.
Wie Sie sich vorstellen können, ist dies eine zeit- und speicherintensive Operation.
Die beste Option ist also, einen Index in die Tabelle zu platzieren, um alle benötigten Zeilen so schnell wie möglich zu erhalten, und sie dann mit php
zu verarbeiten um die benötigten Daten zu erhalten.
Sehen Sie sich übrigens den Leitfaden zur MySQL-Optimierung an .