공통 규칙

B-tree 인덱스는 왼쪽부터 좁혀야 찾을 수 있다

문자열의 앞부분이 고정되면 인덱스가 시작 범위를 바로 잡지만, 앞이 비어 있으면 어디서 스캔을 시작할지 결정할 수 없습니다.

접두사 고정 김%, 김_수
정렬된 이름 구간만 탐색
앞이 비어 있음 %김, %김%
시작 위치가 불명확
패턴
접두사 상태
결과
LIKE '김%'
첫 글자부터 고정됨
인덱스 사용
LIKE '%김'
앞부분이 비어 있음
인덱스 미사용
LIKE '%김%'
양쪽 모두 탐색 필요
인덱스 미사용
LIKE '김_수'
앞 글자 구간은 유지됨
인덱스 사용
포함 검색

%김% 은 B-tree 대신 전문 검색 경로로 보낸다

중간에 있는 문자열을 찾으려면 정렬 순서보다 토큰화와 역색인이 더 적합합니다.

LIKE '%김%' 은 문자열의 어느 위치든 일치 가능
→ 시작 범위를 인덱스에서 바로 계산할 수 없음
그래서 전문 검색 인덱스로 포함 검색 전용 구조를 사용
DBMS 예시
Oracle
CREATE INDEX idx_ft ON users(name)
INDEXTYPE IS CTXSYS.CONTEXT;
MySQL
ALTER TABLE users
ADD FULLTEXT INDEX ft_name(name);
PostgreSQL
CREATE INDEX idx_gin ON users
USING gin(to_tsvector('korean', name));