0

나는 수천 개의 상점이있는 테이블 stores을 가지고 있습니다. 각 상점에 대해 lat, lngdelivery_radius이있는 경우 (point 열을 추가 할 수 있음), 현재 내가있는 상점으로 전달할 수있는 상점을 확인하는 가장 효율적인 방법은 무엇입니까?설정 포인트로 전달되는 모든 행을 찾기위한 MySQL 공간 쿼리

나 자신과 각 행 사이의 거리가 delivery_radius보다 작은 지 확인하는 것은 매우 긴 과정 일 것입니다. 각 행의 정보에서 계산 된 다각형을 저장하는 열을 추가하고 내 현재 점이 해당 다각형 (점 다각형)에 있는지 확인하는 것이 가장 좋을까요? 다른 제안?

답변

1

SQL 쿼리에서 다음 코드 세그먼트를 사용하여 두 개의 지리 지점 간 거리를 얻을 수 있습니다.

ROUND((3959 * acos(cos(radians(IFNULL(P1.LAT, 0))) * cos(radians(IFNULL(P2.LAT, 0))) * cos(radians(IFNULL(P2.LNG, 0)) - radians(IFNULL(P1.LNG, 0))) + sin(radians(IFNULL(P1.LAT, 0))) * sin(radians(IFNULL(P2.LAT, 0))))),3) AS DISTANCE 

그러나 이것은 매우 비용이 많이 드는 작업이며 데이터가 커질 때 확실히 성능 문제가 있습니다. 다각형을 유지 보수하는 것은 새 상점 추가마다 다각형을 갱신해야하므로 어려울 수 있으며 데이터가 커질 때 갱신 프로세스는 기하 급수적으로 느려집니다.

RDMBS에서이 작업을 수행 할 필요가 없다면, 이러한 종류의 작업을 기본적으로 지원하는 elasticsearch와 같은 다른 기술을 고려해보십시오. 참조하시기 바랍니다 https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html

+0

다각형을 오해했을 수도 있습니다. 이것은 모든 상점을 포함하는 단일 다각형이 아 U니다. 이것은 각 상점에 저장되는 다각형입니다. 그런 식으로 현재 위치를 해당 다각형과 비교할 수 있습니다. 제 이론은 각 상점에 대해 "서비스 가능 영역"을 생성하는 계산을 한 번 더 수행하지 않아도된다는 것입니다. 이게 당신의 생각을 전혀 바꿔 놓았습니까? 확실히 elasticsearch를 들여다 봅니다. –

+0

저는 실제로 여러분이 언급 한 폴리곤 개념을 이해하지 못합니다. 명확히하기 위해 위치가 동적인지 또는 정적입니까? 새 저장소가 추가되면 폴리곤이 어떻게 영향을 받고 있습니까? 요구 사항은 현재 위치로 배달 할 수있는 상점 목록을 식별하는 것입니까? 다각형이 새 저장소를 추가 할 때이를 처리하는 방법은 무엇입니까? – Aruna

+0

내 위치는 동적이며 내 위치에 따라 생성됩니다. 제가 언급 한 다각형 개념은 다각형 아이디어의 한 점입니다. 현재 위치가 하나의 지점이지만 각 상점의 배달 반경을 다각형으로 저장할 수 있습니다. 각 점 사이의 거리를 계산하고 반지름보다 작거나 같은지 확인하는 대신 현재 점이 각 점의 폴리곤에 있는지 확인하여 검색하는 것이 더 빠릅니까? –

관련 문제