테마
특수 인덱스
일반 B-Tree 인덱스로는 처리하기 어려운 검색을 위한 인덱스 네 가지를 다룬다. 공간 데이터, 전문 검색(full-text search), 함수 결과, JSON 배열처럼 칼럼 하나에 값이 여러 개 든 다중값이다. 각각 언제 쓰는지 한 줄만 알면 된다.
| 인덱스 | 용도 | 핵심 |
|---|---|---|
| R-Tree (SPATIAL) | 공간 데이터(좌표·범위) | MBR(최소 경계 사각형) 포함·교차 검색. ST_Contains 등과 함께 |
| 전문 검색(FULLTEXT) | 자연어 키워드 검색 | 단어 분리·불용어(stopword)·관련도 랭킹. MATCH ... AGAINST |
| 함수 기반 | 표현식 결과에 인덱스 | 가상 칼럼(virtual column) + 인덱스, 또는 함수 직접 지정(8.0) |
| 멀티 밸류 | JSON 배열 원소 | CAST(... AS ... ARRAY) 인덱스로 배열 원소 검색 |
언제 쓰나 — 한 줄씩
- R-Tree: "이 반경 안의 매장" 같은 공간 조건에 쓴다. 위도 범위와 경도 범위를 B-Tree 범위 조건 2개로 AND해 찾는 것보다, 도형을 사각형 단위로 묶어 찾는 전용 구조가 빠르다. 칼럼은 SRID(Spatial Reference System Identifier, 공간 참조계 식별자)를 명시한 공간 타입으로 만든다.
- 전문 검색:
LIKE '%키워드%'처럼 앞에 와일드카드가 붙으면 어디서 시작할지 알 수 없어 B-Tree 인덱스를 타지 못한다. 그래서 문서·게시글 검색이면 FULLTEXT 인덱스를 쓴다. 기본 파서(parser)는 공백·쉼표·마침표 같은 구분 문자로 단어를 나눈다. 한국어 검색에는 글자를 n개씩 잘라 색인하는 n-gram 파서를 쓰며, 이 파서 설정과 불용어, 최소 글자 수 설정이 함정 지점이다. 데이터가 대규모면 외부 검색엔진으로 넘긴다. - 함수 기반:
WHERE LOWER(email) = ?처럼 칼럼을 가공한 뒤 비교하면, 원본 칼럼 인덱스와 표현식이 달라 그 인덱스를 쓸 수 없다. 이때는 가공 결과를 담는 생성 칼럼(generated column)에 인덱스를 걸거나, 8.0의 함수 키 파트(functional key part,INDEX ((LOWER(email))))로 표현식 자체에 인덱스를 만든다. 어느 쪽이든 쿼리의 표현식이 인덱스 정의와 맞아야 한다. 생성 칼럼의 종류와 제약은 JSON·ENUM·TEXT와 생성 칼럼 2에서 본다. - 멀티 밸류: 멀티 밸류 인덱스(multi-valued index)는 JSON 배열의 원소 하나하나를 인덱스 항목으로 만든다.
CAST(... AS ... ARRAY)로 정의한다.MEMBER OF,JSON_CONTAINS,JSON_OVERLAPS처럼 지원되는 조건에서 활용되며, 일반 B-Tree의 모든 연산을 대신하지는 않는다. JSON 타입 자체는 JSON·ENUM·TEXT와 생성 칼럼에서 다룬다.
면접 포인트
- 네 가지 이름을 용도와 짝지어 말하면 된다. 깊게 파는 면접은 드물다.
- "LIKE '%x%'가 느려요" → 앞 와일드카드는 B-Tree 불가 → FULLTEXT 또는 검색엔진. 이 한 줄이 가장 자주 쓰인다.
- "함수 씌운 조건이 인덱스를 안 타요" → 가공 후 비교는 정렬 활용 불가 → 가상 칼럼·함수 인덱스.
