Skip to content
난이도 문제은행 6

특수 인덱스 ​

일반 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 또는 검색엔진. 이 한 줄이 가장 자주 쓰인다.
  • "함수 씌운 조건이 인덱스를 안 타요" → 가공 후 비교는 정렬 활용 불가 → 가상 칼럼·함수 인덱스.

관련 문서