TechBridge

복합 인덱스 & Covering Index — 컬럼 순서가 성능을 결정한다

← 목록으로

📋 실습 안내

✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기 내 코드 실행 결과
🎯 완성 미리보기 목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기 이번 강의 전용
  선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. 복합 인덱스 (user_id, status, created_at)에서 WHERE status = 'paid' AND created_at > '2024-01-01' 쿼리는?
💡 선두 컬럼(user_id)이 WHERE 조건에 없으면 복합 인덱스를 사용할 수 없습니다. B-Tree는 왼쪽부터 정렬되어 있어 첫 번째 컬럼이 지정되지 않으면 인덱스 탐색이 불가능합니다.
Q2. WHERE user_id = ? AND amount > 1000 쿼리에서 최적의 인덱스 컬럼 순서는?
💡 등호 조건 컬럼(user_id)을 앞에, 범위 조건 컬럼(amount)을 뒤에 배치해야 합니다. 범위 컬럼 이후의 컬럼은 인덱스 탐색(Seek)에 사용될 수 없고 필터(Filter)만 됩니다.
Q3. PostgreSQL 11+에서 INCLUDE 절의 역할은?
💡 INCLUDE 절의 컬럼은 B-Tree의 내부 노드(정렬 키)가 아닌 리프 노드에만 저장됩니다. 검색 조건에는 사용할 수 없지만 SELECT 시 Heap 접근 없이 데이터를 반환할 수 있어 Index-Only Scan이 가능해집니다.
Q4. Index-Only Scan이 Heap을 아예 접근하지 않으려면 추가로 필요한 조건은?
💡 Index-Only Scan은 Visibility Map(VM)을 참조하여 해당 페이지가 "all-visible"(모든 행이 모든 트랜잭션에 보임)인지 확인합니다. VM이 갱신되지 않으면 행의 가시성 확인을 위해 Heap에 접근합니다. VACUUM이 VM을 갱신합니다.
Q5. SELECT * FROM orders WHERE user_id=1 AND status='paid' 쿼리에서 커버링 인덱스 효과를 없애는 것은?
💡 SELECT *는 테이블의 모든 컬럼을 반환합니다. 인덱스에 포함되지 않은 컬럼이 있으면 반드시 Heap에 접근해야 하므로 Index-Only Scan이 불가능합니다. 커버링 인덱스 효과를 얻으려면 SELECT 컬럼을 명시적으로 지정해야 합니다.
🎉

퀴즈 통과!

점수: 0점 — 수고하셨습니다!

다음 강의로 →
😅

아쉽네요!

점수: 0점 — 70점 이상이 되어야 통과합니다.