피드로 돌아가기
Dev.toDatabase
원문 읽기
B-tree Index 도입을 통한 Rate Limiter 지연시간 100배 개선
Indexing: The Force Awakens in My Rate Limiter Quest
AI 요약
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 같은 전용 타입을 사용할 것