계산한 결과를 미리 정렬해 둔다
CREATE INDEX ... ON users (LOWER(email))은 소문자로 바꾼 이메일을 색인해 WHERE LOWER(email) = 'x'를 빠르게 해. 질의의 표현이 색인과 같아야 해.
자주 찾는 파생값에 써
LOWER(email), UPPER(sku), (payload->>'user_id'), (first_name || ' ' || last_name), DATE(timestamp_col)처럼 반복 계산되는 표현이 후보야.
모양이 다르면 다른 색인이야
LOWER(email) 색인은 email::TEXT 질의와 같지 않아. 함수가 안정적으로 같은 결과를 내는지도 확인하고, 복잡해지면 생성 열로 이름을 붙여 읽기 쉽게 만들어. 관련 열을 INSERT하거나 UPDATE할 때마다 표현식을 다시 계산해. LOWER나 JSONB 필드 접근은 대개 싸지만, 계산이 비싸면 쓰기 비용도 커져.