MySQL query optimization checklist: 느린 쿼리를 볼 때 확인할 것들
DB

MySQL query optimization checklist: 느린 쿼리를 볼 때 확인할 것들


MySQL 쿼리 성능 문제를 만날 때마다 매번 처음부터 생각하면 놓치는 것이 많습니다. 그래서 실무에서는 일정한 점검 순서를 갖고 보는 편이 훨씬 효율적입니다.

이 글은 긴 설명보다는 실제로 slow query를 볼 때 바로 펼쳐볼 수 있는 checklist 형태로 정리했습니다.

핵심은 느린 쿼리는 한 번에 고치려 하지 말고, 접근 경로, 읽는 양, 정렬, 결과 크기 순서로 차근차근 좁혀가는 것입니다.

1. 어떤 쿼리가 진짜 느린가

  • 느린 쿼리를 정확히 식별했는가
  • 평균이 느린가, 특정 상황에서만 느린가
  • 최근 배포 이후 달라졌는가

2. EXPLAIN을 봤는가

  • typeALL인가
  • keyNULL인가
  • rows가 비정상적으로 큰가
  • ExtraUsing 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. 테스트 환경만 보고 만족한다

운영 데이터 규모에서는 결과가 다를 수 있습니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.