[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.그럼 우선 당신이 지리 공간 데이터를 많이 가지고 있다면, 당신은 오히려이 같은 계산보다 mysql을의 지리 공간 확장을 사용해야합니다. 그런 다음 많은 쿼리를 가속화 할 공간 인덱스를 만들 수 있습니다 당신은 위의 같은 긴 쉬었 쿼리를 작성할 필요가 없습니다.
그럼 우선 당신이 지리 공간 데이터를 많이 가지고 있다면, 당신은 오히려이 같은 계산보다 mysql을의 지리 공간 확장을 사용해야합니다. 그런 다음 많은 쿼리를 가속화 할 공간 인덱스를 만들 수 있습니다 당신은 위의 같은 긴 쉬었 쿼리를 작성할 필요가 없습니다.
이 ST_Distance와을 비교 한을 사용하거나 ST_Within에 함께 관심의 반경의 형상을 만드는 것은 당신에게 좋은 결과를 줄 수 있으며 훨씬 빨리 현재보다 수 있습니다. 가장 빠른 방법이를 달성하기 그러나 ST_Dwithin는 MySQL은 아직 구현되지 않습니다.
-
==============================
2.공간 인덱스는 확실히 MySQL 버전에 따라 달라집니다. 우리의 사이트뿐만 아니라 위도 / Lons의 검색,하지만 우리는 MySQL은 (5.1 일) (NO 공간 인덱스)의 이전 버전을 사용하고 있습니다. 귀하의 질문은 우리와 비슷하지만, 우리는 라디안을 기반으로합니다. 당신의 정확한 필요에 따라, 당신은 꽤 (당신이 가진 것과)를 최적화 할 수 있습니다.
공간 인덱스는 확실히 MySQL 버전에 따라 달라집니다. 우리의 사이트뿐만 아니라 위도 / Lons의 검색,하지만 우리는 MySQL은 (5.1 일) (NO 공간 인덱스)의 이전 버전을 사용하고 있습니다. 귀하의 질문은 우리와 비슷하지만, 우리는 라디안을 기반으로합니다. 당신의 정확한 필요에 따라, 당신은 꽤 (당신이 가진 것과)를 최적화 할 수 있습니다.
우리가 그것을 어떻게 적어도 그입니다.
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
'SQL' 카테고리의 다른 글
[SQL] ASP.Net에서 SQL 주입을 방지 (0) | 2020.05.06 |
---|---|
[SQL] 당신은 어떻게 하나 개는 mysql_query에서 여러 SQL 문을합니까? (0) | 2020.05.06 |
[SQL] 이미 생성 된 테이블에 오라클에서 자동 증가 (0) | 2020.05.06 |
[SQL] 어떻게 MySQL의 날짜 격차를 채우기 위해? (0) | 2020.05.05 |
[SQL] 오라클 SQL은 - 연속 값 범위를 확인 (0) | 2020.05.05 |