MySQL 쿼리 성능 문제를 만날 때마다 매번 처음부터 생각하면 놓치는 것이 많습니다. 그래서 실무에서는 일정한 점검 순서를 갖고 보는 편이 훨씬 효율적입니다.
이 글은 긴 설명보다는 실제로 slow query를 볼 때 바로 펼쳐볼 수 있는 checklist 형태로 정리했습니다.
핵심은 느린 쿼리는 한 번에 고치려 하지 말고, 접근 경로, 읽는 양, 정렬, 결과 크기 순서로 차근차근 좁혀가는 것입니다.
1. 어떤 쿼리가 진짜 느린가
- 느린 쿼리를 정확히 식별했는가
- 평균이 느린가, 특정 상황에서만 느린가
- 최근 배포 이후 달라졌는가
2. EXPLAIN을 봤는가
type이ALL인가key가NULL인가rows가 비정상적으로 큰가Extra에Using filesort,Using temporary가 보이는가
3. 인덱스가 쿼리 패턴에 맞는가
- WHERE 조건 컬럼에 맞는 인덱스가 있는가
- JOIN 키에 인덱스가 있는가
- ORDER BY까지 고려한 인덱스인가
- 함수나 변환 때문에 인덱스를 못 타는가
4. 너무 많은 row를 읽고 있지 않은가
- 필요한 row만 읽는가
- LIMIT이 필요한데 빠져 있지 않은가
- 넓은 범위를 불필요하게 훑고 있지 않은가
5. 반환 결과가 너무 크지 않은가
SELECT *를 쓰고 있지 않은가- 실제로 필요한 컬럼만 가져오는가
- 애플리케이션이 다 쓰지 않는 데이터를 과하게 읽고 있지 않은가
6. 정렬과 임시 작업 비용이 큰가
- ORDER BY가 큰 비용을 만들고 있지 않은가
- GROUP BY나 DISTINCT가 무거운가
- 정렬용 임시 테이블이 커지고 있지 않은가
7. 조인 구조가 비효율적이지 않은가
- 조인 순서가 비효율적인가
- 조인 대상 row 수가 너무 큰가
- 일부 테이블을 먼저 좁히는 편이 더 낫지 않은가
8. 쓰기 쿼리라면 잠금 영향도 봤는가
- 긴 트랜잭션 안에서 실행되는가
- 같은 row를 자주 건드리는가
- lock wait timeout이나 deadlock과 연결되는가
9. 운영 환경에서 다시 검증했는가
- 실제 데이터 양에서도 같은 현상이 보이는가
- 테스트 환경과 데이터 분포 차이가 큰가
- 개선 전후 비교 기준이 있는가
자주 하는 실수
1. 인덱스 하나 추가하고 끝낸다
실제 원인은 정렬, 조인, 결과 크기일 수도 있습니다.
2. 쿼리 문장만 보고 고친다
실행 계획을 안 보면 감으로 수정하게 됩니다.
3. 테스트 환경만 보고 만족한다
운영 데이터 규모에서는 결과가 다를 수 있습니다.
Read Next
- 체크리스트의 출발점인 실행 계획 읽기는 MySQL EXPLAIN 가이드에서 더 자세히 볼 수 있습니다.
- 실제 사례 흐름은 MySQL slow query 가이드와 이어집니다.
계속 읽어볼 글
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
계속 읽어볼 글
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.