피드로 돌아가기
From Cache Keys to Concurrency
Dev.toDev.to
Backend

Composite Index와 Cache Normalization을 통한 쿼리 성능 99% 개선

From Cache Keys to Concurrency

Ali Agboola2026년 6월 13일12intermediate

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 전략 수립

원문 읽기