Mysql
 sql >> база данни >  >> RDS >> Mysql

База данни:Най-добрият начин за ефективност за запитване на данни за географско местоположение?

Има добър документ за ефективността на геолокацията на MySQL тук .

РЕДАКТИРАНЕ Със сигурност това използва фиксиран радиус. Също така не съм 100% сигурен, че алгоритъмът за изчисляване на разстоянието е най-напреднал (т.е. ще „пробива“ през Земята).

Важното е, че алгоритъмът е евтин, за да ви даде ограничение за паркиране на топката за броя на редовете, за да извършите правилно търсене на разстояние.

Алгоритъмът филтрира предварително, като взема кандидати в квадрат около изходната точка, след което изчислява разстоянието в мили .

Предварително изчислете това или използвайте съхранена процедура, както предлага източникът:

# 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UTF8 MySQL проблеми на Rails - проблеми с кодирането с utf8_general_ci

  2. JPA Запазване на грешна дата в MySQL база данни

  3. Как да използвате множество бази данни в Laravel

  4. Как да изпълните съхранена процедура в MySQL Workbench

  5. Използвайте чувствителен към акцент първичен ключ в MySQL