공통 전제
일반 인덱스는 원본 name 값 기준으로 정렬됩니다.
따라서 조건식도 같은 표현식이어야 바로 찾을 수 있습니다. 컬럼 쪽 표현식이 바뀌면 인덱스가 가진 키와 어긋납니다.
문제 상황
컬럼에 함수 적용
조회 조건이 인덱스 키와 달라집니다.
해결 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)` 조건도 바로 탐색할 수 있습니다.
핵심 기억
인덱스는 저장된 키와 같은 표현식일 때만 빠릅니다. 해결 방법도 결국 두 가지입니다: 조건식을 원본 컬럼 형태로 되돌리거나, 그 표현식을 인덱스에 미리 저장하는 것입니다.