무신사, 10초 타임아웃을 20ms로 줄인 비결 공개!

by DD
9개월 전
조회수 31

1억 건 이상의 데이터 증가로 인해 체험단 API10초 타임아웃 문제 발생

커버링 인덱스쿼리 분리 전략을 통해 데이터 전송량 99% 감소

P99 레이턴시 350ms → 20ms17배 성능 향상 달성

인덱스 최적화: 커버링 인덱스의 마법

기존 쿼리의 DATE_FORMAT 함수는 인덱스 활용을 방해했다. 따라서 신청일자 컬럼을 추가하여 함수 없이 정렬하도록 변경했다. 커버링 인덱스를 설계하여 SELECT 절에 필요한 모든 컬럼을 포함시켰다. 결과적으로 테이블 접근 없이 인덱스 온리 스캔을 통해 I/O 병목 현상을 해결했다.

쿼리 분리 전략: 데이터 전송량 최소화

커버링 인덱스 적용에도 성능 개선이 미미했다. SELECT 절에 필요한 컬럼이 인덱스에 포함되지 않았기 때문이다. 쿼리 분리를 통해 신청번호만 먼저 조회하고, 이후 상세 정보를 가져오는 방식으로 변경했다. 따라서 데이터 전송량을 획기적으로 줄여 네트워크 I/O 병목을 해결했다.

성능 개선의 핵심: 데이터 결합 방식 변경

기존에는 JOIN을 사용하여 데이터를 결합했지만, 쿼리 분리 후 애플리케이션에서 데이터를 결합하도록 변경했다. 각 테이블을 독립적으로 최적화하고, JOIN 복잡도를 제거했다. 결과적으로 디버깅 용이성을 높이고, 향후 확장성 확보에 기여했다.

10초 타임아웃에서 벗어나기까지의 여정