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

복합 색인의 열 순서

~12 min · indexes, composite

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

왼쪽부터 사용할 수 있어

복합 색인은 여러 열을 이어 붙인 하나의 B-tree야. CREATE INDEX ... ON orders (customer_id, placed_at DESC)는 고객 조건으로 범위를 좁힌 뒤 그 안에서 시각 순서를 제공해. (a, b, c)는 보통 a, a + b, a + b + c에 유리하지만 bc만 찾는 질의에는 바로 맞지 않아.

동등 조건을 범위보다 앞에

WHERE customer_id = 7 AND placed_at >= '2026-04-01'에는 (customer_id, placed_at)가 자연스러워. 일반적으로 (eq_col, range_col)(range_col, eq_col)보다 뒤 열까지 활용하기 좋아.

실제 질의 묶음으로 결정해

열 5개를 한 색인에 넣는다고 모든 조합이 빨라지지는 않아. 자주 실행되는 질의의 선두 조건과 정렬을 모아 가장 많은 일을 하는 순서를 골라.

Code

복합 색인·sql
-- 지원: WHERE customer_id = ?  /  WHERE customer_id = ? AND placed_at > ?
-- 잘 지원 못함: WHERE placed_at > ? 단독
CREATE INDEX orders_customer_placed_idx ON orders (customer_id, placed_at DESC);

-- ORDER BY 가 공짜로 따라옴
SELECT id, total FROM orders
WHERE  customer_id = 7
ORDER  BY placed_at DESC
LIMIT  5;
-- orders_customer_placed_idx 의 Index Scan — 별도 sort step 없음.
단일 열 색인 2개를 함께 쓰는 경우·sql
-- 가끔 두 단일 컬럼 인덱스로 충분; planner 가 Bitmap And 로 결합.
-- 완벽한 composite 보다 느리지만 더 유연.
CREATE INDEX orders_customer_idx ON orders (customer_id);
CREATE INDEX orders_status_idx   ON orders (status);

EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 7 AND status = 'paid';
-- Plan: orders 에 Bitmap Heap Scan + 두 인덱스의 BitmapAnd.

External links

Exercise

열 2개로 거르는 질의를 골라 두 가지 열 순서의 복합 색인을 각각 시험하고 EXPLAIN을 비교해. 이어서 단일 열 색인 2개를 따로 만든 경우도 비교해 계획기가 무엇을 선택하고 왜 그런지 설명해.

Progress

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

댓글 0

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

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