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

Optimieren von MySQL ORDER BY für eine Berechnung, die mit WHERE geteilt wird

Nein, die Berechnung wird nicht zweimal durchgeführt, wenn sie genau gleich geschrieben ist. Wenn es jedoch Ihr Ziel ist, die Leistung Ihrer Anwendung zu verbessern, sollten Sie das Gesamtbild betrachten, anstatt sich auf dieses kleine Detail zu konzentrieren, das Ihnen höchstens einen Faktor von zwei Unterschieden bringen könnte. Ein schwerwiegenderes Problem besteht darin, dass Ihre Abfrage eine effiziente Verwendung von Indizes verhindert und zu einem vollständigen Scan führt.

Ich würde empfehlen, dass Sie Ihre Datenbank so ändern, dass Sie den Geometrietyp verwenden und einen räumlicher Index auf Ihre Daten. Dann können Sie MBRWithin um schnell die Punkte zu finden, die innerhalb des Begrenzungsrahmens Ihres Kreises liegen. Sobald Sie diese Punkte gefunden haben, können Sie Ihren teureren Entfernungstest nur an diesen Punkten durchführen. Dieser Ansatz ist erheblich schneller, wenn Ihre Tabelle groß ist und eine typische Suche nur einen kleinen Bruchteil der Zeilen zurückgibt.

Wenn Sie das Datenmodell nicht ändern können, können Sie die Leistung dennoch verbessern, indem Sie zuerst eine Begrenzungsrahmenprüfung verwenden, zum Beispiel WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . Die Begrenzungsrahmenprüfung kann einen Index verwenden, aber da R-Tree-Indizes nur für den Geometrietyp unterstützt werden, müssen Sie den Standard-B-Tree-Index verwenden, der für diese Art von Abfrage nicht so effizient ist (aber immer noch viel besser als das, was Sie derzeit tun).