evergreen96
337
2021-03-11 19:42:55
7
437

위치기반 DB검색 질문


DB에 외, 경도 좌표가 저장되어 있고 

내 위치를 기반으로 반경 (N) km를 검색한다고 할 때 내 위치와 DB안의 값의 거리 계산을 통해서 원하는 값을 가져올 수 있겠지만 하나하나 이렇게 계산하면 양이 많아질수록 서버에 무리가 가지 않을까 생각이 듭니다. 

전부다 계산해서 하는 방법말고 있을까요?

0
  • 답변 7

  • rezigrene
    1k
    2021-03-11 20:04:25

    상하좌우 N km 로 목록뽑고 그안에서 원안에 포함되는걸 뽑으면 되겠죠.

  • Carefully
    466
    2021-03-11 20:35:27

    반경에서 뽑을 공간데이터... 공간쿼리.. 쓰시야죠

    postgis..

  • 캐티
    5k
    2021-03-11 22:39:39

    두점 거리 함수를 만들어서 쓰면 되빈다.

    데이터 구조적인 최적화도 하여야해서 위도 경도 둘다 구획으로 나눠서 인접 지역 9개만 검색하도록 인덱스를 구성하여야하빈다.

    머 이렇게 설계까지 반영해서 하는 경우는 잘 없을것 같스빈다.

    https://docs.microsoft.com/ko-kr/sql/relational-databases/spatial/spatial-data-sql-server

    상업용으로는 이미 이런 데이터 타입들을 제공하고 있쩌여.

    머 알고 있었던건 아니고 필요할때 검색해서 구현체가 있는지 먼저 조사를 해본 거빈다.

  • ansdbduf
    903
    2021-03-11 22:54:22 작성 2021-03-11 22:58:39 수정됨

    일단 위,경도를 숫자타입에서 지오메트리타입으루 바꾸시고 공간인덱스를 주시면 검색이 빠를거에요. 예를 들면 postgis의 btree인덱스말고 gist인덱스 타입쓰시면 됩니다.

  • yeori
    2k
    2021-03-12 00:12:21

    서버에 무리가 발생하면 고민할 문제같습니다.

  • Purex
    2
    2021-03-12 01:43:20 작성 2021-03-12 01:56:39 수정됨

    몇가지 방법이 있기는 합니다.


    1. R-Tree 기반의 인덱스 쓰는 법

    2. Geohash 형태로 좌표값을 변경해서 검색

       1. Base 32 Prefix 매칭 검색

        2. 정수값으로 바꿔서 B-tree 인덱스 걸고 검색


    3. 그 외 방법들

    (쿼드트리 압축이라던가 kd-tree 기반 검색 등등)



    개인적으로 2-2(geohash 로 정수값 만들어서)번 방법이 제일 빠르더라고요

    (R-TREE 보다 아무래도 B-Tree 가 더 빠르...네요..)


    아 그리고 인덱스가지고 검색해야되니깐

    Where 찾으려는 위치 > (현재값)-거리 and 

    위치 < (현재값)+거리


    이런식으로 검색해야 인덱스를 타기때문에 더 빨리 검색 됩니다.

    (900만 로우 검색 기준으로 geohash 썼을때 0.001초 정도 걸렸고 R-tree 썼을때는 1-2초 +@ 정도 걸린거 같네요)


    (만약 자바 스프링 쓰시면 S2 라이브러리 같은 좋은것들이 있으니 가져다 쓰시면 됩니다.)


    자세한 내용은 아래 글 참고바랍니다.


    https://semtax.tistory.com/m/98


    (근데 이렇게 10초넘게 걸린 검색쿼리 0.01초 최적화한 경험 어필해도 ㅠ..  서류나 면접때 안알아주는게 함정이네요 ㅠㅠ)

  • evergreen96
    337
    2021-03-17 23:06:29
    조언 감사합니다. 
  • 로그인을 하시면 답변을 등록할 수 있습니다.