Mysql
 sql >> Base de données >  >> RDS >> Mysql

Base de données :Meilleure performance pour interroger les données de géolocalisation ?

Il y a un bon article sur les performances de géolocalisation de MySQL ici .

MODIFIER Je suis sûr que cela utilise un rayon fixe. De plus, je ne suis pas sûr à 100 % que l'algorithme de calcul de la distance soit le plus avancé (c'est-à-dire qu'il "percera" la Terre).

Ce qui est important, c'est que l'algorithme est bon marché pour vous donner une limite approximative du nombre de lignes pour effectuer une recherche de distance appropriée.

L'algorithme pré-filtre en prenant les candidats dans un carré autour du point source, puis en calculant la distance en miles .

Pré-calculez ceci ou utilisez une procédure stockée comme le suggère la source :

# 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