피드로 돌아가기
Indexing: The Force Awakens in My Rate Limiter Quest
Dev.toDev.to
Database

B-tree Index 도입을 통한 Rate Limiter 지연시간 100배 개선

Indexing: The Force Awakens in My Rate Limiter Quest

Timevolt2026년 6월 14일5intermediate

Context

Postgres 기반의 IP별 Rate Limiter 구현 중 요청 증가에 따른 성능 저하 발생. 수백만 건의 데이터가 적재된 테이블에서 Index 없이 Sequential Scan이 수행됨에 따라 CPU 부하가 급증하고 Latency가 2ms에서 200ms로 상승한 상황.

Technical Solution

  • IP 컬럼에 B-tree Index를 적용하여 O(n)의 탐색 복잡도를 O(log n)으로 단축
  • 정렬 상태 유지를 통한 효율적인 Range Query 지원 및 Index Scan 유도로 CPU 사이클 낭비 제거
  • FOR UPDATE 락과 B-tree 구조의 호환성을 통한 Race Condition 방지 및 데이터 일관성 확보
  • Hash Index 대비 Crash-safe 특성과 정렬 기능을 제공하는 B-tree를 선택하여 시스템 안정성 강화
  • IP 저장 타입을 TEXT에서 INET으로 변경하여 세부 연산 최적화 및 추가 성능 향상 달성
  • ANALYZE 명령어를 통한 통계 정보 갱신으로 Query Planner의 최적 경로 선택 유도

- EXPLAIN ANALYZE를 사용하여 Sequential Scan 발생 여부를 상시 모니터링할 것 - Index 생성 후 반드시 ANALYZE를 수행하여 Planner의 최신 통계 정보를 반영할 것 - Write Overhead를 고려하여 실제 쿼리에 사용되는 컬럼 위주로 최소한의 Index를 유지할 것 - IP 주소와 같이 도메인 특화 데이터는 TEXT 대신 INET/CIDR 같은 전용 타입을 사용할 것

원문 읽기