mySQL: Nachbarorte finden
bearbeitet von Regina Schaukrug
> ~~~mysql
> SELECT
> ...
> ,ROUND( 6366.19773095 * ACOS( SIN(".$rad_lat1.") *SIN(RADIANS(ort1.geo_breite)) +COS(".$rad_lat1.") *COS(RADIANS(ort1.geo_breite)) *COS(RADIANS(ort1.geo_laenge) -".$rad_lon1." ))) dist_km
> ...
> GROUP BY ...
> ORDER BY dist_km
> LIMIT 0,10
> ~~~
Das Problem ist doch alt: Jede Berechnung mit Werten aus den Tabellen in der Where-Clausel führt zu einem Full-Tabel-SCAN und ist also langsam.
Suche Orte mit maximaler und minimaler Länge und Breite, dann bleiben die Indizes nutzbar. Kreisberechnung dann nur für diese Auswahl (entweder temporäre Tabelle oder aber als Iteration über den Ergebnis-Array in der Programmiersprache, welche die Datenbank befragt.)