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

고유 색인과 부분 색인

~12 min · indexes, unique, partial

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

고유성은 조회 최적화이자 규칙이야

UNIQUE 제약과 CREATE UNIQUE INDEX는 중복을 막으면서 빠른 동등 조회도 제공해. 업무 규칙이라면 단순 성능 도구가 아니라 데이터 무결성으로 취급해야 해.

필요한 행만 색인해

행의 95%가 완료 상태고 활성 상태가 5%뿐이라면 활성 행만 담는 부분 색인이 작고 효율적이야. 색인의 WHERE 조건을 질의가 논리적으로 포함해야 계획기가 사용할 수 있어.

작을수록 쓰기 비용도 줄어

부분 색인은 디스크·캐시 사용량과 갱신 비용을 줄이지만 조건 밖의 질의에는 도움이 되지 않아. 삭제되지 않은 사용자 사이에서만 이메일을 고유하게 유지하는 것처럼, 조건부 고유성은 부분 고유 색인으로 강제할 수 있어.

Code

고유 색인·sql
-- UNIQUE 제약과 동등
CREATE UNIQUE INDEX users_email_uniq ON users (email);

-- 다중 컬럼 unique
CREATE UNIQUE INDEX user_product_review ON reviews (user_id, product_id);

-- Partial unique: 비-삭제 유저 중 email unique
CREATE UNIQUE INDEX users_active_email_uniq
ON users (email)
WHERE deleted_at IS NULL;
자주 쓰는 질의를 위한 부분 색인·sql
-- pending 주문의 작은 부분집합만 인덱스
CREATE INDEX orders_pending_idx
ON orders (placed_at DESC)
WHERE status = 'pending';

-- predicate 매치 쿼리가 partial 인덱스 사용
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE  status = 'pending'
ORDER  BY placed_at DESC
LIMIT  20;
-- 작은 인덱스, 매우 빠른 스캔, status 필터 불필요.

External links

Exercise

status, deleted_at, archived 같은 열에서 대부분의 행은 한 상태이고 소수 상태만 자주 조회하는 사례를 찾아. 드문 상태를 조건으로 부분 색인을 추가하고 EXPLAIN 전후를 비교해.

Progress

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

댓글 0

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

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