Keine MySQL-spezifische Antwort, aber es verbessert die Leistung Ihrer SQL-Anweisung.
Was Sie effektiv tun, ist die Berechnung des Abstands zu jedem Punkt in der Tabelle, um festzustellen, ob er innerhalb von 10 Einheiten eines bestimmten Punkts liegt.
Bevor Sie diese SQL ausführen, können Sie vier Punkte erstellen, die eine Box mit 20 Einheiten auf einer Seite zeichnen, wobei sich Ihr Punkt in der Mitte befindet. (x1, y1). . . (x4, y4), wobei (x1, y1) ist (gegeben + 10 Einheiten, gegebenLat + 10 Einheiten). . . (GivenLong - 10 Einheiten, GivenLat -10 Einheiten).
Eigentlich brauchen Sie nur zwei Punkte, oben links und unten rechts nennen sie (X1, Y1) und (X2, Y2)
Jetzt verwendet Ihre SQL-Anweisung diese Punkte, um Zeilen auszuschließen, die definitiv mehr als 10u von Ihrem angegebenen Punkt entfernt sind. Sie kann Indizes für die Breiten- und Längengrade verwenden, sodass sie um Größenordnungen schneller sind als derzeit.
z.B
select . . .
where locations.lat between X1 and X2
and locations.Long between y1 and y2;
Der Box-Ansatz kann falsch positive Ergebnisse zurückgeben (Sie können Punkte in den Ecken der Box aufnehmen, die> 10u vom angegebenen Punkt entfernt sind), sodass Sie immer noch den Abstand jedes Punkts berechnen müssen. Dies wird jedoch wieder viel schneller sein, da Sie die Anzahl der zu testenden Punkte drastisch auf die Punkte in der Box beschränkt haben.
Ich nenne diese Technik "Denken in der Kiste" :)
EDIT: Kann dies in eine SQL-Anweisung eingefügt werden?
Ich habe keine Ahnung, wozu mySql oder Php in der Lage ist, sorry. Ich weiß nicht, wo der beste Ort ist, um die vier Punkte zu erstellen, oder wie sie an eine mySql-Abfrage in PHP übergeben werden könnten. Sobald Sie jedoch die vier Punkte erreicht haben, hindert Sie nichts mehr daran, Ihre eigene SQL-Anweisung mit meiner zu kombinieren.
select name,
( 3959 * acos( cos( radians(42.290763) )
* cos( radians( locations.lat ) )
* cos( radians( locations.lng ) - radians(-71.35368) )
+ sin( radians(42.290763) )
* sin( radians( locations.lat ) ) ) ) AS distance
from locations
where active = 1
and locations.lat between X1 and X2
and locations.Long between y1 and y2
having distance < 10 ORDER BY distance;
Ich weiß, dass ich mit MS SQL eine SQL-Anweisung erstellen kann, die vier Gleitkommazahlen deklariert (X1, Y1, X2, Y2) und diese vor der "main" select-Anweisung berechnet, wie gesagt, ich habe keine Ahnung, ob dies möglich ist MySql. Ich wäre jedoch immer noch geneigt, die vier Punkte in C # zu erstellen und sie als Parameter an die SQL-Abfrage zu übergeben.
Es tut mir leid, ich kann nicht mehr helfen. Wenn jemand die MySQL- und PHP-spezifischen Teile davon beantworten kann, können Sie diese Antwort jederzeit bearbeiten.