복붙노트

[SQL] 가장 빠른 방법은 반경 MySQL을 내 포인트에 대한 큰 테이블을 조회하는 뭐죠 (위도, 경도)

SQL

가장 빠른 방법은 반경 MySQL을 내 포인트에 대한 큰 테이블을 조회하는 뭐죠 (위도, 경도)

현재 내가 100,000 + 행이 몇 테이블이있다. 나는 다음과 같은 데이터를 조회하려합니다.

SELECT
*, SQRT(POW(69.1 * (latitude - '49.1044302'), 2) + POW(69.1 * ('-122.801094' - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM stops
HAVING distance < 5
ORDER BY distance limit 100

그러나 현재이 방법은 높은 부하와 속도가 느려집니다. 일부 쿼리를 완료하는 데 20 + 초를하고있다.

사람이 최적화 할 수있는 더 나은 방법을 알고 있다면이 좋은 것입니다.

해결법

  1. ==============================

    1.그럼 우선 당신이 지리 공간 데이터를 많이 가지고 있다면, 당신은 오히려이 같은 계산보다 mysql을의 지리 공간 확장을 사용해야합니다. 그런 다음 많은 쿼리를 가속화 할 공간 인덱스를 만들 수 있습니다 당신은 위의 같은 긴 쉬었 쿼리를 작성할 필요가 없습니다.

    그럼 우선 당신이 지리 공간 데이터를 많이 가지고 있다면, 당신은 오히려이 같은 계산보다 mysql을의 지리 공간 확장을 사용해야합니다. 그런 다음 많은 쿼리를 가속화 할 공간 인덱스를 만들 수 있습니다 당신은 위의 같은 긴 쉬었 쿼리를 작성할 필요가 없습니다.

    이 ST_Distance와을 비교 한을 사용하거나 ST_Within에 함께 관심의 반경의 형상을 만드는 것은 당신에게 좋은 결과를 줄 수 있으며 훨씬 빨리 현재보다 수 있습니다. 가장 빠른 방법이를 달성하기 그러나 ST_Dwithin는 MySQL은 아직 구현되지 않습니다.

  2. ==============================

    2.공간 인덱스는 확실히 MySQL 버전에 따라 달라집니다. 우리의 사이트뿐만 아니라 위도 / Lons의 검색,하지만 우리는 MySQL은 (5.1 일) (NO 공간 인덱스)의 이전 버전을 사용하고 있습니다. 귀하의 질문은 우리와 비슷하지만, 우리는 라디안을 기반으로합니다. 당신의 정확한 필요에 따라, 당신은 꽤 (당신이 가진 것과)를 최적화 할 수 있습니다.

    공간 인덱스는 확실히 MySQL 버전에 따라 달라집니다. 우리의 사이트뿐만 아니라 위도 / Lons의 검색,하지만 우리는 MySQL은 (5.1 일) (NO 공간 인덱스)의 이전 버전을 사용하고 있습니다. 귀하의 질문은 우리와 비슷하지만, 우리는 라디안을 기반으로합니다. 당신의 정확한 필요에 따라, 당신은 꽤 (당신이 가진 것과)를 최적화 할 수 있습니다.

    우리가 그것을 어떻게 적어도 그입니다.

  3. from https://stackoverflow.com/questions/38548473/whats-the-fastest-way-to-lookup-big-tables-for-points-within-radius-mysql-latit by cc-by-sa and MIT license