Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Banco de dados:Melhor maneira de desempenho para consultar dados de localização geográfica?


Há um bom artigo sobre o desempenho de geolocalização do MySQL aqui .

EDITAR Tenho certeza que isso está usando o raio fixo. Também não estou 100% certo de que o algoritmo para calcular a distância seja o mais avançado (ou seja, "perfurará" a Terra).

O que é significativo é que o algoritmo é barato para fornecer um limite de bola no número de linhas para fazer a pesquisa de distância adequada.

O algoritmo faz a pré-filtragem ao selecionar candidatos em um quadrado ao redor do ponto de origem e, em seguida, calcular a distância em milhas .

Pré-calcule isso ou use um procedimento armazenado como a fonte sugere:
# 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