• yundream
  • 2018-02-01 14:39:05
  • 2017-10-08 16:05:53
  • 169760

Mysql Spatial Query

R-트리 인덱스를 사용하기 위해서는 MyISAM테이블을 만들어야 한다. 다른 스토리지 엔진의 경우 B-트리 인덱스를 사용하는데, 정확한 값을 찾는 것에는 유용하지만 범위 스캔에는 효율적이지 않다. 공간 데이터의 경우 범위 검색을 많이 하므로 MyISAM 테이블을 만들자.

CREATE TABLE restaurant (
  name      VARCHAR(80),
  category  VARCHAR(20),
  latitude  FLOAT,
  longitude FLOAT,
  geom      GEOMETRY NOT NULL,
  p         INT,
  SPATIAL INDEX(geom)
) ENGINE=myISAM DEFAULT CHARSET=utf8;
INSERT INTO restaurant VALUES('푸켓쌀국수', '기타', 37.499851, 127.026272, POINT(127.026272, 37.499851),3 );
INSERT INTO restaurant VALUES('메드포갈릭', '이탈리안', 37.497774, 127.026615, POINT(127.026615, 37.497774),4 );
INSERT INTO restaurant VALUES('아리랑', '한식', 37.499587, 127.027098, POINT(127.027098, 37.499587),5 );
INSERT INTO restaurant VALUES('참치공방', '한식', 37.497868, 127.028428, POINT(127.028428, 37.497868),5 );
INSERT INTO restaurant VALUES('베이징', '중식', 37.496395, 127.029297, POINT( 127.029297, 37.496395),3 );
이해하기 쉽게 구글맵에 표시를 했다.
구글 지도 상의 나의 위치({lat: 37.497933, lng: 127.026993})를 중심으로 150m 반경안에 있는 식당을 찾아보자.
SELECT name, ST_Distance_Sphere(geom, POINT(127.026993, 37.497933)) from restaurant where ST_Distance_Sphere(geom, POINT(127.026993, 37.497933)) <= 150; 
+-----------------+--------------------------------------------------------+
| name            | ST_Distance_Sphere(geom, POINT(127.026993, 37.497933)) |
+-----------------+--------------------------------------------------------+
| 메드포갈릭      |                                      37.74379308955364 |
| 참치공방        |                                     126.80064076970785 |
+-----------------+--------------------------------------------------------+

이미 있는 테이블에 spatial 인덱스를 추가 할 수도 있다.
CREATE SPATIAL INDEX geo_index ON restaurant(geom);
mysql> show index from restaurant \G
*************************** 1. row ***************************
        Table: restaurant
   Non_unique: 1
     Key_name: geo_index
 Seq_in_index: 1
  Column_name: geom
    Collation: A
  Cardinality: NULL
     Sub_part: 32
       Packed: NULL
         Null: 
   Index_type: SPATIAL
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

Aurora

공간정보 색인은 그냥 Aurora쪽으로 밀고가야겠다.