코딩
[MySQL] Point Column 성능에 관한 고찰 본문
프로젝트에서 사용자들의 발자취를 따라 위도와 경도를 계산하여 반경 5km 이내에 있는 다른 사용자들의 발자취를 보여줘야 했다.
이 과정에서 위도와 경도를 DB에서 어떻게 표현해야 성능이 빨라질까? 에 대한 고민을 했고
최종적으로 2가지의 후보가 나왔다.
1. 위도 경도 Column을 varchar로 두개를 따로 만들어서 반경 계산하기
2. 위도 경도를 Point ColumncolumnDefinition = "POINT SRID 4326"으로 만들어 반경 계산하기
1. 위도와 경도를 Cloumn으로 각각 만들어서 반경 계산하기(하버사인 공식 이용)
SELECT p.plogging_id as ploggingId ,p.start_lat as startLat, p.start_lng as startLng, (6371*acos(cos(radians(37.500603))*cos(radians(p.start_lat))*cos(radians(p.start_lng)
-radians(127.036397))+sin(radians(37.500603))*sin(radians(p.start_lat)))) distance
FROM plogging p
WHERE (6371*acos(cos(radians(37.500603))*cos(radians(p.start_lat))*cos(radians(p.start_lng)
-radians(127.036397))+sin(radians(37.500603))*sin(radians(p.start_lat)))) <= 5;
2. 위도와 경도를 "POINT SRID 4326"으로 만들어서 반경 계산하기
`start_coordinate` POINT NULL DEFAULT NULL SRID 4326'
// plogging 테이블의 데이터를 그대로 복사(쿼리를 실행할 때 필요한 데이터만 복사)
insert into plogging3(plogging_id, start_coordinate)
select plogging_id, st_pointfromtext(concat('POINT(', start_lat, ' ', start_lng, ')'), 4326)
from plogging;
// 반경 5km 이내 플로깅 기록 조회(인덱스 안걸었을때)
SELECT p3.plogging_id as ploggingId, p3.start_coordinate as coordinate, ST_Distance_Sphere(p3.start_coordinate, st_srid(POINT(127.036397, 37.500603), 4326))
FROM plogging3 p3
WHERE ST_Distance_Sphere(p3.start_coordinate, st_srid(POINT(127.036397, 37.500603), 4326)) <= 5000;
데이터가 적어서 그런지 둘의 성능에 유의미한 차이를 보이지 못했다. 또한 JPA 상에서 데이터를 불러 올 때, POINT 형식으로 데이터를 불러오는 것이 그렇게 훨씬 편하다거나 데이터 관리가 쉽다고 느끼지 못했다.
그럼 POINT라는 geometry 타입은 왜 쓰는 것일까?
이것은 Spatial Index를 쓰면 말이 달라진다.
geometry 타입은 Spatial Index라는 것을 쓸 수 있는데, 이를 사용하면 내 위치에서 일정 범위 안에 있는 좌표들을 미리 필터링할 수 있기 때문에 성능이 개선된다.
'DB' 카테고리의 다른 글
[DB] 동시성에 관한 고찰 (0) | 2022.12.12 |
---|---|
[JPA] nativeQuery에서 dto 매핑하기 (0) | 2022.12.12 |
공공데이터 API parser 데이터 오류잡기 (0) | 2022.05.13 |
Comments