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

MySQL-Abfrage langsam bei Verwendung von Order By mit Funktion zur Berechnung des Abstands zwischen zwei Punkten (long, lat)

Optionen:

  1. Integrieren Sie die Sortierung in Ihre Definition/Logik gespeicherter Prozeduren. Wenn Ihre aufrufende SQL-Auswahl innerhalb Ihrer gespeicherten Prozedur die Sortierung und Begrenzung dort durchführt . - Das bedeutet, dass Sie nicht 10.000 Zeilen in der gespeicherten Prozedur erzeugen, nur um sie neu zu sortieren. Auch wenn die Tabelle Indizes hat, kann die ursprüngliche Sortierung innerhalb der SQL-Auswahl viel schneller sein.

  2. Überprüfen Sie, ob die Indizierung in Ihrer Tabelle verwendet wird. - Indizes bewirken, dass Ihre Sortierungen bei der Auswahl in der Tabelle schneller durchgeführt werden.

Bitte stellen Sie uns die Funktionsdefinition zur Verfügung, es wäre einfacher, Ihnen zusätzlich zu helfen.

Versuchen Sie schließlich, Ihre Bestellung direkt innerhalb Ihrer Funktion zu verschieben und zu begrenzen, anstatt sie später zu tun. Ihre Funktion kann die 10 Ergebnisse direkt sortiert und fertig zurückgeben. Wenn Sie möchten, erstellen Sie zwei Funktionen - eine, die die vollständigen Ergebnisse zurückgibt, und eine, die sie begrenzt und sortiert zurückgibt.

Aktualisierung:

Nachdem Sie Ihre Funktion gesehen haben, wird deutlich, dass Sie versuchen, nach einem berechneten Wert zu bestellen. Das Ordnen nach berechneten Werten ist extrem langsam, wie auch erwähnt in:

Ich versuche zu überlegen, wie Sie Ihre Daten basierend auf col1 oder col2 "vorverarbeiten/anordnen" könnten, um die endgültige Bestellung Ihrer Ergebnisse zu beschleunigen. Wenn col1 und col2 Spalten der Tabelle sind und funResult eine mathematische Funktion ist, die grafisch dargestellt werden kann, hat eine der beiden eine größere Auswirkung auf den Funktionsrückgabewert....

Schließlich, wenn col1 und col2 Spalten von myTable sind, müssen Sie keine gespeicherte Funktion verwenden, könnten aber mit abfragen, aber das würde keinen großen Unterschied machen ... Ihr Hauptproblem ist das Sortieren nach einer berechneten Funktion:

SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10

Aktualisierung 2:

Nachdem ich nach dem Problem der zu berechnenden Sortierentfernung gegraben hatte, fand ich heraus, dass dies unter dem folgenden Link sehr effizient gestellt und gelöst wurde. In Bezug auf das Sortieren nach einem berechneten Wert ist das Sortieren nach einem berechneten Wert von Natur aus langsam. Weitere Hilfe finden Sie unter den folgenden beiden Links:

Abschließend kommt Ihrer Antwort am nächsten: https://stackoverflow.com/a/4180065/1688441