피드로 돌아가기
Dev.toBackend
원문 읽기
Composite Index와 Cache Normalization을 통한 쿼리 성능 99% 개선
From Cache Keys to Concurrency
AI 요약
Context
단일 컬럼 인덱스 기반의 Postgres DB와 기본적인 Redis 캐싱 구조를 사용했으나, 다중 필터 쿼리 시 Bitmap Index Scan으로 인한 병목 현상이 발생함. 또한 입력 순서에 따른 Cache Key 불일치와 대용량 CSV 업로드 시의 Heap Memory 부하 및 네트워크 Round Trip 증가 문제가 공존함.
Technical Solution
- 다중 필터링 성능 최적화를 위해 데이터 선택도가 높은 컬럼 순으로 Composite Index를 구성하여 Bitmap Scan 오버헤드 제거
- Cache Key 일관성 확보를 위해 필터 객체의 소문자 변환, 알파벳순 정렬, 타입 강제 변환을 수행하는 Normalization 로직을 쿼리 진입점에 배치
- 대용량 CSV 처리를 위해 Multer diskStorage와 Read Stream을 결합한 파이프라인을 구축하여 Node.js Heap 메모리 사용량 최소화
- 1,000개 행 단위의 Chunk 기반 Bulk Insert와 skipDuplicates 설정을 통해 네트워크 비용 감소 및 부분 실패 시 Idempotency 보장
- Transient Failure와 Permanent Failure를 구분하여, 전자는 Queue의 Retry 메커니즘을 활용하고 후자는 DB 기록 후 종료하는 에러 핸들링 전략 채택
실천 포인트
1. 다중 조건 검색 쿼리 시 단일 인덱스 조합(Bitmap Scan) 대신 Composite Index 검토
2. 캐시 키 생성 전 입력 데이터의 정규화(Normalization) 단계 포함 여부 확인
3. 대용량 파일 처리 시 Memory Buffer 대신 Stream 기반의 Chunking 처리 적용
4. 벌크 작업 설계 시 실패 지점부터 재시작 가능한 Idempotency 전략 수립