문제 상황
컬럼에 함수 적용
조회 조건이 인덱스 키와 달라집니다.
해결 A
비교값을 컬럼 형태에 맞춤
컬럼 자체는 그대로 두고 값을 조정합니다.
해결 B
함수 기반 인덱스 생성
변환된 표현식 자체를 인덱스 키로 저장합니다.
검색식
SELECT * FROM users
WHERE UPPER(name) = 'KIM';
SELECT * FROM users
WHERE name = 'Kim';
CREATE INDEX idx_users_name_upper
ON users(UPPER(name));
SELECT * FROM users
WHERE UPPER(name) = 'KIM';
인덱스가 가진 키
name 원본값만 정렬됨
`Kim`, `Lee`, `Park` ...
name 원본값 그대로 사용
조건식과 인덱스 키가 일치
UPPER(name) 값이 저장됨
`KIM`, `LEE`, `PARK` ...
실행 결과
인덱스 사용 불가 → Full Scan
`UPPER(name)`은 기존 인덱스에 없는 변환값이라 바로 찾지 못합니다.
인덱스 사용 가능
대소문자 처리 규칙을 비교값에서 맞출 수 있다면 가장 단순한 해결입니다.
인덱스 사용 가능
함수 결과를 인덱스가 직접 보관하므로 `UPPER(name)` 조건도 바로 탐색할 수 있습니다.