코딩

[MySQL] Point Column 성능에 관한 고찰 본문

DB

[MySQL] Point Column 성능에 관한 고찰

ssooyn_n 2022. 12. 12. 16:34

프로젝트에서 사용자들의 발자취를 따라 위도와 경도를 계산하여 반경 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