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형이 바로 이런 느낌이다.
예를 들면 이런 테이블이 있잖아요.
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형이 바로 이런 느낌이다.
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));
하나하나 해설하는 말
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
select id, ST_X(loc), ST_Y(loc) from location where ST_Within(loc, ST_Buffer(POINT(35.685, 139.762), 0.009));
참조: https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
이렇게 하면 거리 순서에 따라 정렬하지 않았기 때문에 가까운 순서로 얻으려면 어디에서 정렬해야 하는지 mysql에서나 응용에서나 달라지지 않기 때문에 보수성과 규모성을 고려해 응용 프로그램으로 하는 것이 좋다.
그리고 이 부근은 기본적으로querydsl의 물건이어서 SQL을 쓸 수 없습니다.
Reference
이 문제에 관하여(MySQL의 POINT형을 사용하여 가까운 기록을 찾습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takc923/items/51ff59be6a916faa7576텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)