피드로 돌아가기
Why Standard Indexes Fail: The Architecture of the Covering Index
Dev.toDev.to
Database

Covering Index 도입으로 쿼리 성능 2,000배 향상 (217ms → 0.106ms)

Why Standard Indexes Fail: The Architecture of the Covering Index

OPEYEMI OLUWAGBEMIGA2026년 5월 2일5intermediate

Context

대규모 listen_history 테이블에서 특정 사용자의 최신 재생 기록을 조회하는 쿼리 처리. Standard Index 사용 시 Index-Leaf에서 Main Heap으로의 잦은 물리적 접근인 Heap Fetch가 발생하며 I/O 병목 지점 형성.

Technical Solution

  • user_idplayed_at DESC를 조합한 복합 Index 구조 설계로 데이터 사전 정렬 구현
  • INCLUDE 절을 통한 track_id 데이터의 Leaf Node 직접 삽입으로 Index-Only Scan 유도
  • Main Heap 접근을 완전히 제거하여 물리적 Disk I/O 발생 가능성 차단
  • B-Tree 내부 정렬 순서를 활용한 In-memory Heap Sort 단계 제거
  • Visibility Map 업데이트를 통한 트랜잭션 일관성 확인 절차 최적화

Impact

  • 실행 시간 217ms에서 0.106ms로 단축
  • Full-table Scan 및 Heap Fetch 제거를 통한 Disk I/O 부하 해소

1. 초당 수천 건 이상의 고빈도 호출 쿼리인지 확인

2. SELECT 대상 컬럼이 UUID, Timestamp 등 가벼운 데이터 타입으로 구성되었는지 검토

3. 대규모 텍스트나 JSON 데이터의 INCLUDE 포함 여부 확인 (Write 성능 저하 방지)

4. PostgreSQL 환경에서 Index-Only Scan 미작동 시 VACUUM을 통한 Visibility Map 갱신 고려

원문 읽기