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

Datenbank:Bester Performance-Weg zum Abfragen von Geo-Standortdaten?

Es gibt hier .

BEARBEITEN Ziemlich sicher, dass dies einen festen Radius verwendet. Außerdem bin ich mir nicht 100 % sicher, dass der Algorithmus zur Berechnung der Entfernung der fortschrittlichste ist (d. h. er wird durch die Erde "bohren").

Was wichtig ist, ist, dass der Algorithmus billig ist, um Ihnen eine ungefähre Grenze für die Anzahl der Zeilen zu geben, um eine ordnungsgemäße Entfernungssuche durchzuführen.

Der Algorithmus filtert vor, indem er Kandidaten in einem Quadrat um den Quellpunkt nimmt und dann die Entfernung in Meilen berechnet .

Berechnen Sie dies im Voraus oder verwenden Sie eine gespeicherte Prozedur, wie die Quelle vorschlägt:

# Pseudo code
# user_lon and user_lat are the source longitude and latitude
# radius is the radius where you want to search
lon_distance = radius / abs(cos(radians(user_lat))*69);
min_lon = user_lon - lon_distance;
max_lon = user_lon + lon_distance;
min_lat = user_lat - (radius / 69);
max_lat = user_lat + (radius / 69);
SELECT dest.*,
  3956 * 2 * ASIN(
    SQRT(
      POWER(
        SIN(
          (user_lat - dest.lat) * pi() / 180 / 2
        ), 2
      ) + COS(
        user_lat * pi() / 180
      ) * COS(
        dest.lat * pi() / 180
      ) * POWER(
        SIN(
          (user_lon - dest.lon) * pi() / 180 / 2
        ), 2
      )
    )
  ) as distance
FROM dest
WHERE 
  dest.lon between min_lon and max_lon AND
  dest.lat between min_lat and max_lat
HAVING distance < radius
ORDER BY distance
LIMIT 10