DB

[MySQL] (GIS4️⃣) 공간 인덱스의 원리와 설정 방법

인생아 2025. 7. 18. 15:50
반응형

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

 

반응형