Regina Schaukrug: mySQL: Nachbarorte finden

Beitrag lesen

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-TABLE-SCAN und ist also langsam. Schreib EXPLAIN vor das SELECT und Du siehst es.

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.)