MySQL의 POINT형을 사용하여 가까운 기록을 찾습니다

3399 단어 MySQL

개요


mysql로 위치를 표시하는 기록을 검색할 때 Spatial Data Types POINT형을 사용하는 것이 좋습니다.
그건 내가 설명할게.

Spatial Data Type을 사용해야 하는 이유


예를 들면 이런 테이블이 있잖아요.
CREATE TABLE `location_lat_lng` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lat` double NOT NULL,
  `lng` double NOT NULL,
  PRIMARY KEY (`id`),
  KEY `lat` (`lat`,`lng`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
latitude와longtitude의 위치 정보표를 나타낸다.
이런 걸 던지잖아요.
select * from location_lat_lng 
where lat between 35.681  and 35.691
  and lng between 139.757 and 139.767;
에서 이 색인은 유효하지 않습니다.MySQL은 여러 일반 인덱스 범위를 지정하는 데 적합하지 않습니다.자세한 내용은 고성능 MySQL 실천 5.4.2를 참조하십시오.
Spatial Data Types는 빠른 검색에 유용합니다.이 물건들의 인덱스는 R-Tree 인덱스라고 불리며 상술한 용례에 대한 검색이 매우 강하다.

Spatial Data Type


MySQL형은 위치, 선, 도형 등의 개념에 사용되는 데이터형이다.반면 Spatial Data Types는 대상을 향한 언어 등급으로 맨 위에는 GEOMEETRY형, 아래에는 POINT형이 바로 이런 느낌이다.
  • https://dev.mysql.com/doc/refman/5.7/en/gis-geometry-class-hierarchy.html
  • 에서 위치를 검색할 때 POINT 유형을 사용합니다.

    POINT 유형 사용


    POINT형은 위에서 사용하는 테이블의lat와 lng을 합쳐서 하나의 데이터형을 만든다.
    이걸로 이 표를 다시 쓰면 이런 느낌이에요.
    CREATE TABLE `location` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `loc` point NOT NULL,
      PRIMARY KEY (`id`),
      SPATIAL KEY `loc` (`loc`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    loc는 POINT 유형의 열입니다.
    예컨대 35.685139.762 지점부터 1km 이내의 지점을 찾는다는 느낌
    select id, ST_X(loc), ST_Y(loc) from location where ST_Within(loc, ST_Buffer(POINT(35.685, 139.762), 0.009));
    
    하나하나 해설하는 말
  • POINT형의 실례는 POINT(x, y) 느낌으로 제작됐다.
  • ST_버퍼(g,d)에서는 g에서 거리 d까지의 그래픽, 즉 이번 경우 POINT(35.685139.762)를 중심으로 반경 0.009의 엔화를 그렸다.
  • 에서 이 거리는 0.009와 위도경도가 같고 지구는 일주일에 4075km, 40075km*(0.009/360)≈1km이다.
  • ST_g1이 g2에 포함된 경우 Within(g1, g2)은 진짜 함수입니다.
  • 따라서 이번의 경우 POINT(35.685139.762)에서 반경 1km의 원에 들어가면 진짜
  • 직접 select loc를 사용하면 loc의 2진법은 그렇게 출력되는 것 같아서 원인을 알 수 없습니다.따라서 select 부분에서 POINT에서 lat, lng의 ST를 꺼냅니다.X, ST_Y 함수를 사용합니다.

  • 참조: https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
    이렇게 하면 거리 순서에 따라 정렬하지 않았기 때문에 가까운 순서로 얻으려면 어디에서 정렬해야 하는지 mysql에서나 응용에서나 달라지지 않기 때문에 보수성과 규모성을 고려해 응용 프로그램으로 하는 것이 좋다.
    그리고 이 부근은 기본적으로querydsl의 물건이어서 SQL을 쓸 수 없습니다.

    좋은 웹페이지 즐겨찾기