피드로 돌아가기
Busca fuzzy em 55 milhões de registros: como pg_trgm salvou meu projeto
Dev.toDev.to
Database

pg_trgm GIN Index 도입으로 1.5억 건 데이터 300ms 내 검색 달성

Busca fuzzy em 55 milhões de registros: como pg_trgm salvou meu projeto

Pedro Parker2026년 4월 17일6intermediate

Context

5,500만 건 이상의 기업 데이터셋에서 Fuzzy Search 구현 필요성 증대. Elasticsearch 도입 시 발생하는 운영 복잡도, 데이터 동기화 지연, 고사양 RAM 비용 문제를 해결하기 위한 경량 아키텍처 설계 요구.

Technical Solution

  • PostgreSQL pg_trgm 확장 모듈을 통한 문자열의 Trigram 분해 및 유사도 검색 기반 마련
  • 읽기 성능 최적화를 위해 업데이트 빈도가 낮은 데이터 특성을 고려한 GIN Index 채택
  • 3개 테이블(기업, 사업장, 파트너) 대상 UNION ALL 쿼리 및 각 분기별 LIMIT 1,000 설정을 통한 전체 스캔 방지
  • ILIKE 연산자와 GIN Index의 조합으로 Trigram 필터링 후 정확한 Substring 매칭을 수행하는 고효율 검색 구조 설계
  • Redis 기반의 캐싱 레이어 도입을 통한 반복 쿼리의 응답 시간 단축 및 DB 부하 분산
  • IN 절을 활용한 데이터 Hydration 처리로 N+1 쿼리 문제 해결 및 네트워크 왕복 횟수 최소화

- 데이터 업데이트 주기와 읽기 비중을 분석하여 GIN vs GiST 인덱스 선택 - UNION ALL 사용 시 각 서브쿼리에 LIMIT를 설정하여 최악의 경우에도 응답 시간 보장 - 검색 결과 리스트의 상세 정보를 가져올 때 IN 절을 통한 일괄 조회(Hydration) 적용 - 텍스트 검색과 같이 비용이 높은 쿼리는 Redis를 통해 단기 캐싱 적용 검토

원문 읽기