본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

표현식 색인

~12 min · indexes, expression

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

계산한 결과를 미리 정렬해 둔다

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 필드 접근은 대개 싸지만, 계산이 비싸면 쓰기 비용도 커져.

Code

대소문자를 무시한 이메일 조회·sql
CREATE INDEX users_email_lower_idx ON users (LOWER(email));

-- 이제 인덱스 사용
SELECT * FROM users WHERE LOWER(email) = 'alice@example.com';

-- 더 좋음: lowercase 를 generated column 에 저장 + 그거 인덱스
ALTER TABLE users
ADD COLUMN email_lower TEXT GENERATED ALWAYS AS (LOWER(email)) STORED;

CREATE INDEX users_email_lower_gen_idx ON users (email_lower);
JSONB 필드 인덱스·sql
-- JSONB 컬럼 안 단일 필드 인덱스
CREATE INDEX events_user_id_idx ON events ((data->>'user_id'));

-- 이제 빠름
SELECT * FROM events WHERE data->>'user_id' = '42';
이름을 이어 붙인 전체 이름 검색·sql
CREATE INDEX users_full_name_idx
ON users ((first_name || ' ' || last_name));

SELECT * FROM users
WHERE  first_name || ' ' || last_name = 'Ada Lovelace';

External links

Exercise

프로젝트에서 LOWER, DATE, ->>처럼 열을 함수나 연산자로 감싸는 질의를 찾아. 그 모양과 일치하는 표현식 색인을 추가하고 EXPLAIN으로 성능이 나아졌는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.