부분 인덱스 & 표현식 인덱스 — 조건부 인덱스로 크기는 줄이고 속도는 높이고
📋 실습 안내
✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기
내 코드 실행 결과
🎯 완성 미리보기
목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기
이번 강의 전용
▼
선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. 부분 인덱스 CREATE INDEX idx ON orders(user_id) WHERE status = 'pending' 가 사용되는 쿼리는?
💡 부분 인덱스는 인덱스의 WHERE 조건(status = 'pending')과 쿼리의 WHERE 조건이 일치해야 사용됩니다. 쿼리에 user_id 조건과 status = 'pending' 조건이 모두 있어야 이 인덱스를 탈 수 있습니다.
Q2. 표현식 인덱스에 사용할 수 없는 함수 속성은?
💡 PostgreSQL 표현식 인덱스에는 IMMUTABLE(같은 입력에 항상 같은 결과) 함수만 사용할 수 있습니다. STABLE(같은 트랜잭션 내에서만 일정) 또는 VOLATILE 함수는 인덱스 생성 시 오류가 발생합니다.
Q3. LOWER(email) 표현식 인덱스가 있을 때 인덱스를 사용하지 못하는 쿼리는?
💡 ILIKE는 PostgreSQL의 대소문자 무관 LIKE로, LOWER(email) 표현식 인덱스와 같은 결과를 내지만 내부적으로 다른 표현식을 사용합니다. 따라서 LOWER(email) 인덱스를 사용하지 않습니다. WHERE LOWER(email) = ... 또는 WHERE email ILIKE ... 에는 각각 별도의 인덱스가 필요합니다.
Q4. 소프트 삭제(soft delete) 패턴에서 가장 효율적인 인덱스 전략은?
💡 소프트 삭제 패턴에서 대부분의 쿼리는 "삭제되지 않은" 행을 대상으로 합니다. 부분 인덱스 WHERE deleted_at IS NULL을 사용하면 삭제된 행을 인덱스에서 제외하여 크기가 작고 쓰기 오버헤드도 줄어듭니다.
Q5. JSONB 컬럼 meta에서 meta->>'user_id' 값으로 검색할 때 최적의 인덱스는?
💡 meta->>'user_id'라는 특정 JSON 경로의 값으로만 검색한다면, 표현식 인덱스 CREATE INDEX ON logs((meta->>'user_id'))가 가장 효율적입니다. GIN은 전체 JSONB 구조를 인덱싱하여 크기가 크고, 특정 경로 조회에는 표현식 인덱스가 훨씬 가볍습니다.
😅
아쉽네요!
점수: 0점 — 70점 이상이 되어야 통과합니다.