반응형
MySQL에서 GIS 기능을 제대로 활용하려면 공간 인덱스(SPATIAL INDEX)에 대한 이해가 필수다.

📌 공간 인덱스란?
공간 인덱스는 공간 데이터 검색을 빠르게 하기 위한 인덱스 구조다.
일반적인 B-Tree 인덱스와는 달리, R-Tree 또는 MySQL의 내부 구조를 이용하여
POINT, LINESTRING, POLYGON 타입의 위치 기반 조건을 빠르게 처리한다.
🧱 기본 문법: SPATIAL INDEX 설정
CREATE TABLE places (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
location POINT NOT NULL,
SPATIAL INDEX(location)
);
✅ SPATIAL INDEX는 공간 타입 컬럼에만 적용 가능
✅ InnoDB 및 MyISAM 스토리지 엔진에서 지원됨 (MySQL 5.7 이상)
반응형
🔍 공간 인덱스가 필요한 이유
아래와 같은 쿼리에서 성능 향상을 기대할 수 있다:
SELECT name
FROM places
WHERE ST_Contains(
ST_GeomFromText('POLYGON(...)', 4326),
location
);
공간 인덱스가 없으면 전체 테이블 스캔이 발생하여 성능이 급격히 저하된다.
특히 수천 개 이상의 좌표 데이터를 다룰 경우, 인덱스 유무에 따라 수십 배 차이가 날 수 있다.
⚠️ 주의할 점
- 공간 인덱스는 NOT NULL 제약이 필요하다
- 복합 공간 인덱스(여러 컬럼)는 지원되지 않는다
- SRID 값이 일치하지 않으면 인덱스가 무시됨
- 정확한 판단이 필요한 경우 ST_Equals() 등의 정밀 함수로 보정 필요
💡 인덱스가 제대로 동작하는지 확인하기
EXPLAIN FORMAT=JSON
SELECT name
FROM places
WHERE ST_Contains(
ST_GeomFromText('POLYGON(...)', 4326),
location
);
"attached_condition" 또는 "r-tree" 관련 정보가 있으면 인덱스가 사용된 것임
📈 인덱스 활용을 위한 실무 팁
- 좌표 데이터가 많은 서비스라면 무조건 인덱스를 설정할 것
- POLYGON, LINESTRING에도 인덱스를 설정할 수 있지만,
대부분 POINT 좌표 기반 검색이 더 자주 사용됨 - 실시간 데이터 삽입이 잦은 테이블이라면 인덱스 부하를 고려해서 배치 설계 필요
- **범위 검색(RANGE)**이나 거리 기반 검색과 같이 빈번한 필터 조건에 공간 인덱스 필수
🧠 정리 요약
| 항목 | 설명 |
| 인덱스 명령어 | SPATIAL INDEX(컬럼명) |
| 적용 가능 타입 | POINT, LINESTRING, POLYGON 등 |
| 필수 조건 | 공간 컬럼은 NOT NULL이어야 함 |
| SRID 주의 | 인덱스 사용 시 쿼리 내 SRID 일치해야 함 |
공간 인덱스는 성능을 극적으로 향상시킬 수 있는 핵심 도구다.
다음 글에서는 거리 계산과 반경 기반 검색을 실습해보자.
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/creating-spatial-indexes.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (연결최적화2️⃣) 커넥션 풀의 개념과 실무 설정 가이드 (0) | 2025.07.18 |
|---|---|
| [MySQL] (연결최적화1️⃣) JDBC 드라이버 설정 핵심 옵션 정리 (0) | 2025.07.18 |
| [MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음 (0) | 2025.07.18 |
| [MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항 (0) | 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 |
| [MySQL] (JSON6️⃣) 실무에서 JSON 타입을 쓸 때 주의할 점 (4) | 2025.07.17 |