2013-08-08 7 views
6

Diese Abfrage sollte mir das am nächsten kommende Element zu einem gegebenen :x, :y in kartesischen Koordinaten geben.Wie konnte diese Abfrage in Bezug auf die Ausführungsgeschwindigkeit optimiert werden

SELECT `type` 
FROM `mapgen_centers` 
ORDER BY SQRT(POW((:x - `x`), 2) + POW((:y - `y`), 2)) 
LIMIT 1 

Es dauert zur Zeit 0,002S im Durchschnitt, die in Ordnung ist, aber ich habe das Gefühl, das kann besser sein, vor allem, weil ich es zur Zeit sehr Feuer, sehr oft und häufig, so dass die gesamte Ausführung der Skripts Pfähle von einigen Minuten.

Can (und wenn ja, wie) diese durch irgendein Mittel auf einer Standard-MySQL-Installation (Prozeduren, Funktionen, Indizes, Konfiguration, ...)

+0

können Sie eine Spalte mit dem Ergebnis der Formel hinzufügen: 'SQRT (POW ((: x - x), 2) + POW ((: y - y), 2)) 'und addiere einen Index darauf – Stephan

+0

Aber': x', ': y' ändern sich mit jeder Ausführung? Wie kann ich eine Spalte mit dieser Formel erstellen, wenn die Werte vorher nicht bekannt sind? –

+2

Müssen Sie wirklich 'SQRT' verwenden, da es nur zum Sortieren verwendet wird? Ist es nicht so, dass, wenn (x'-x)^2 + (y'-y)^2 höher wird, seine Quadratwurzel auch höher wird? – iCantSeeSharp

Antwort

1

Neben dem Entfernen dieser Quadratwurzel glaube ich nicht, dass dies besser gemacht werden kann. Was Sie überprüfen sollten ist, dass die Ausführungszeit wirklich O(n) ist, was es sein muss, da Sie mindestens einmal alle Elemente durchsuchen müssen. Dies kann durch Überprüfen der Ausführungszeit erreicht werden, die linear mit der Tabellengröße in Ihrer Datenbank zunimmt. Wenn es also bei einer Tabelle von 100000 Zeilen 10 Millisekunden dauert, sollte es bei einer Tabelle von 1000000 Zeilen nur 100 Millisekunden dauern ...

2

Da Sie eine Entfernung zwischen zwei Punkten sind die Berechnung verfügbar optimiert werden Ich denke, dass Sie MySQL verwenden können spatial data type In SO gibt es eine question, die Ihnen helfen könnte.

Alternativ können Sie, wie oben in den Kommentaren erwähnt, einen Index nach dem vorberechneten Wert Ihrer Distanz erstellen.

3

1. Sie können verwenden.

2.Strippen Sie die SQRT-Funktion ab, da dies bei der Bestellung nicht erforderlich ist.

+0

Statt 1. Warum nicht die Summe jedes Mal berechnen X oder Y aktualisiert? – iCantSeeSharp

+0

@Souvlaki 'x' und' y' müssen zwei Spaltennamen sein, daher können wir nicht vorausberechnen. – adamsmith

Verwandte Themen