반응형
MySQL의 GIS 함수 중 ST_Distance()는 두 지리 좌표 간의 직선 거리를 계산할 수 있게 해준다.
하지만 예상과 달리 단위나 계산 방식이 실무와 다를 수 있어 주의가 필요하다.

📐 ST_Distance()란?
ST_Distance(A, B)는 두 지오메트리 객체 간의 거리(길이)를 계산한다.
예:
SELECT ST_Distance(
ST_GeomFromText('POINT(126.9784 37.5665)', 4326),
ST_GeomFromText('POINT(126.9820 37.5700)', 4326)
);
위 쿼리는 경도 126.9784, 위도 37.5665와
경도 126.9820, 위도 37.5700 사이의 거리를 계산한다.
반응형
📏 결과 단위 주의 (미터 아님)
많은 개발자들이 실수하는 부분이 바로 단위이다.
SRID = 4326인 경우, 결과는 미터 단위가 아니라 각도(도 단위) 로 계산된다.
예:
-- 위 결과는 약 0.0045도
-- 이를 미터로 환산하려면 후처리 필요
경도/위도를 실제 거리로 변환하려면 haversine formula를 직접 구현하거나
MySQL 8.0.22 이상에서 지원하는 ST_Distance_Sphere()를 사용하는 것이 좋다.
🌍 ST_Distance_Sphere() 사용 예
SELECT ST_Distance_Sphere(
ST_GeomFromText('POINT(126.9784 37.5665)', 4326),
ST_GeomFromText('POINT(126.9820 37.5700)', 4326)
);
✅ 위 쿼리는 미터 단위로 두 점 간 거리 반환
✅ 실제 지도 반경 검색, 거리 필터링 등 실무용 쿼리에 적합
결과 예시:
약 482.8 (단위: 미터)
🧪 실습 예제: 매장 간 거리 계산
매장 테이블
CREATE TABLE stores (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
location POINT NOT NULL,
SPATIAL INDEX(location)
);
INSERT INTO stores (name, location) VALUES
('지점A', ST_GeomFromText('POINT(126.9784 37.5665)', 4326)),
('지점B', ST_GeomFromText('POINT(126.9820 37.5700)', 4326));
반응형
거리 비교 쿼리
SELECT
s1.name AS store1,
s2.name AS store2,
ST_Distance_Sphere(s1.location, s2.location) AS distance_m
FROM stores s1, stores s2
WHERE s1.id < s2.id;
✅ 지점 간 거리(m) 결과를 확인할 수 있다
✅ WHERE s1.id < s2.id는 중복 계산 제거용
❗ 실무 주의사항 요약
- ST_Distance()는 도 단위 거리 → 실무에 부적절할 수 있음
- ST_Distance_Sphere()는 지구 곡률 반영된 미터 단위 결과 제공
- MySQL 8.0.22 이상에서만 사용 가능
- 대량 좌표 계산 시 성능 이슈 발생 가능 (필요 시 전처리 또는 캐싱 고려)
✅ 정리 요약
| 함수 | 단위 | 특징 |
| ST_Distance | 도(degree) | 정확한 거리 아님, SRID 영향 받음 |
| ST_Distance_Sphere | 미터(m) | 실무 반경 필터링에 적합 |
거리 기반 검색, 반경 내 매장 찾기, 배달 구역 판별 등에 활용되는 중요한 기능이니
단위를 착각해서 오작동하는 일이 없도록 주의하자.
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/gis-distance-functions.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (연결최적화3️⃣) 커넥션 타임아웃 설정과 오류 해결법 (0) | 2025.07.18 |
|---|---|
| [MySQL] (연결최적화2️⃣) 커넥션 풀의 개념과 실무 설정 가이드 (0) | 2025.07.18 |
| [MySQL] (연결최적화1️⃣) JDBC 드라이버 설정 핵심 옵션 정리 (0) | 2025.07.18 |
| [MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음 (0) | 2025.07.18 |
| [MySQL] (GIS4️⃣) 공간 인덱스의 원리와 설정 방법 (1) | 2025.07.18 |
| [MySQL] (GIS3️⃣) POLYGON과 공간 포함관계 쿼리 실습 (4) | 2025.07.18 |
| [MySQL] (GIS2️⃣) 공간 데이터 저장 및 조회 실습: POINT, LINESTRING 활용법 (1) | 2025.07.18 |
| [MySQL] (GIS1️⃣) GIS란? 공간 데이터 타입(POINT, POLYGON 등) 완전 정리 (1) | 2025.07.18 |