피드로 돌아가기
Dev.toDatabase
원문 읽기
Write Cost 간과한 Index 도입으로 인한 DB CPU 및 Disk I/O 폭증 해결
An index made our query faster. It slowly suffocated our database.
AI 요약
Context
1,000만 건 이상의 데이터와 수천 TPS 환경에서 카테고리별 실시간 랭킹 API 구현 필요성 대두. Read 성능 최적화를 위해 Composite Index를 도입했으나, 빈번한 Score 업데이트로 인한 Index 유지 비용이 시스템 전체의 병목으로 작용함.
Technical Solution
- Composite Index(category_id, status, interest_score DESC) 도입을 통한 Read Query 최적화 시도
- 빈번한 UPDATE 발생 시 Index 내 레코드 위치 재배치로 인한 Write Overhead 및 Disk I/O 급증 확인
- 특정 인기 상품에 업데이트가 집중되는 Hotspot 현상으로 인한 DB Lock 경합 및 CPU 사용률 상승 파악
- RDBMS의 Transactional Table에서 실시간 랭킹 계산 로직을 분리하는 아키텍처 전환 결정
- Redis Sorted Sets(ZINCRBY)를 활용하여 Score 업데이트 및 랭킹 추출 로직을 메모리 계층으로 이관
- Redis에서 Top ID 추출 후 DB에서 ID 기반으로 상세 정보를 조회하는 Read-through 구조 설계
실천 포인트
1. Index 추가 전 해당 컬럼의 업데이트 빈도와 Write Overhead 분석
2. 실시간 랭킹, 조회수 등 고빈도 변경 데이터의 DB 직접 업데이트 지양
3. 단일 쿼리 속도보다 전체 Workload 관점의 시스템 헬스 체크 수행
4. 쓰기 집약적 워크로드 분리를 위한 In-memory 데이터 스토어 검토