[10분 테코톡] 피글렛의 소소한 쿼리 튜닝 팁
- 쿼리 튜닝은 쿼리 실행 계획 분석을 통해 불필요한 작업을 줄여 응답 시간을 최소화하는 과정으로, SQL 수정 외에도 인덱스 활용, 데이터 아키텍처 변경, 캐싱 등 다양한 방법으로 진행됩니다. ⚙️
- 인덱스는 특정 컬럼 데이터를 정렬하여 데이터베이스 검색 속도를 향상시키는 자료구조입니다. 📚
- 쿼리 튜닝은 P99 값의 급증과 같은 객관적인 지표를 통해 필요성을 판단해야 합니다. 📈
- 시나리오 1: 필터링 및 정렬 성능 개선 (복합 인덱스)
member_id로 필터링하고 arrived_date_time으로 내림차순 정렬하는 쿼리가 300만 건 데이터에서 약 4초 소요되었습니다. 🐢
EXPLAIN 분석 결과, 전체 테이블 스캔(Type: ALL)과 MySQL 엔진의 정렬(Using filesort)이 성능 저하의 원인이었습니다. 🔍
(member_id, arrived_date_time) 복합 인덱스 생성 후 쿼리 실행 시간이 0.01초로 크게 단축되었습니다. 🚀
- 복합 인덱스는 두 개 이상의 컬럼을 포함하며, WHERE, ORDER BY, GROUP BY 절에 효과적으로 적용될 수 있습니다. 🧩
- 시나리오 2: 특정 컬럼 조회 성능 개선 (커버링 인덱스)
member_id로 필터링하여 id와 title만 조회하는 쿼리가 300만 건 데이터에서 약 3.5초 소요되었습니다. 🐌
EXPLAIN 분석 결과, 전체 테이블 스캔(Type: ALL)과 불필요한 전체 Row 데이터 로딩이 문제였습니다. 💡
(member_id, title) 커버링 인덱스 생성 후 쿼리 실행 시간이 0.00초(0.5ms)로 극적으로 개선되었습니다. ✨
- 커버링 인덱스는 쿼리에 필요한 모든 데이터를 포함하여 디스크 I/O 없이 인덱스만으로 쿼리 결과를 반환합니다(
Using index). 🛡️
- InnoDB의 세컨더리 인덱스는 PK를 기본적으로 포함하므로, 명시적으로 PK를 인덱스에 추가할 필요가 없습니다. 🔑
- 복합 인덱스와 커버링 인덱스의 차이:
- 복합 인덱스는 인덱스에 포함된 필드 수(2개 이상)를 기준으로 분류되며, 커버링 인덱스는 해당 쿼리에 필요한 모든 필드가 인덱스에 존재하는지 여부를 기준으로 분류됩니다. ↔️
- 두 인덱스는 교집합 영역이 존재할 수 있습니다. 🤝
- 결론:
- 복합 인덱스는 여러 기준으로 필터링 또는 정렬이 필요할 때 효과적입니다. 🎯
- 커버링 인덱스는 필요한 필드 수가 적고 디스크 I/O 없이 인덱스 접근만으로 쿼리를 해결하고 싶을 때 효과적입니다. ⚡