BE
[MySQL] MySQL 성능 디버깅, 이 3개면 충분하다
MySQL에서 쿼리 성능을 분석하거나 최적화할 때, 꼭 알아야 할 세 가지 명령어가 있다.
바로 EXPLAIN, SHOW PROFILE, SHOW PROFILES이다.
각각의 역할과 사용 방법, 결과 해석법까지 살펴보자.
EXPLAIN
의미: 쿼리가 실행되었을 때, MySQL이 어떤 방식으로 처리할지 "실행계획"을 보여주는 도구이다.
예시
EXPLAIN SELECT * FROM users WHERE id = 5;실행 결과
컬럼명 | 설명 | 주요 의미 / 해석 | 성능 분석 팁 |
id | 쿼리의 고유 식별자 | 서브쿼리/조인의 순서 구분 | 숫자가 클수록 먼저 실행됨 |
select_type | SELECT 유형 | SIMPLE, PRIMARY, SUBQUERY 등 | 서브쿼리 사용 시 구조 분석 |
table | 접근 대상 테이블 | 각 단계에서 조회되는 테이블 이름 | 조인 순서 확인 가능 |
partitions | 접근한 파티션 | 파티셔닝된 테이블에서 스캔된 파티션 | 접근 파티션이 적을수록 효율적 |
type | 조인 방식 | ALL, index, range, ref, eq_ref, const, system | ALL이면 full scan → 비효율적 |
possible_keys | 사용 가능 인덱스 목록 | 사용할 수 있는 인덱스 후보 | 인덱스가 안 보이면 개선 필요 |
key | 실제 사용된 인덱스 | 옵티마이저가 선택한 인덱스 | null이면 인덱스 미사용 |
key_len | 사용된 인덱스 길이 (바이트) | 어떤 인덱스 조건까지 활용되었는지 | 짧을수록 덜 활용되고 있을 가능성 |
ref | 비교되는 컬럼 또는 상수 | 상수, 조인 컬럼 등 | const, func, table.column 형태 |
rows | 읽게 될 예상 레코드 수 | MySQL이 예측한 스캔 행 수 | 값이 클수록 느려질 수 있음 |
filtered | 조건 만족 행의 비율 (%) | WHERE 조건을 만족할 행의 추정 비율 | 100%에 가까울수록 좋음 |
Extra | 추가 정보 | Using where, Using index 등 | 힌트 제공 (filesort, temporary 등 주의) |
사용 이유
느린 쿼리 원인 파악 (풀스캔 하는지, 인덱스를 제대로 안 쓰는지)
인덱스 사용 여부 확인 가능 (possible_keys vs key 비교)
조인 순서 및 방식 확인 가능
실제 실행 전, 쿼리가 얼마나 많은 데이터를 스캔할지 예측 가능
SHOW PROFILE
의미: 쿼리를 실행하는 동안 발생한 세부적인 리소스 사용 정보를 보여주는 도구이다. (CPU, I/O, 실행 단계 등)
예시
-- 쿼리 실행
SELECT * FROM users WHERE id = 10;
-- 프로파일 보기
SHOW PROFILE FOR QUERY 1;실행 결과
Status | Duration (초) | 설명 |
starting | 0.000030 | 쿼리 실행 시작 준비 단계 |
checking permissions | 0.000005 | 사용자 권한 확인 |
Opening tables | 0.000045 | 테이블을 열고 메타데이터 로딩 |
System lock | 0.000002 | 테이블 락(lock)을 획득 |
init | 0.000010 | 내부 변수 초기화 |
optimizing | 0.000020 | 쿼리 최적화 수행 (인덱스 선택 등) |
statistics | 0.000015 | 통계 정보 수집 (인덱스, row 수 등) |
preparing | 0.000008 | 실행 준비 |
executing | 0.000080 | 쿼리 실행 단계 |
Sending data | 0.000150 | 결과를 클라이언트에 전달 |
end | 0.000002 | 쿼리 종료 처리 |
query end | 0.000003 | 내부 쿼리 마무리 |
closing tables | 0.000004 | 열린 테이블 정리 |
freeing items | 0.000003 | 임시 메모리 해제 |
cleaning up | 0.000002 | 최종 정리 작업 |
사용 이유
어떤 단계가 오래 걸렸는지 파악 가능
예: Sending data가 오래 걸리면 결과 row 수가 많을 수 있음
예: optimizing이 오래 걸리면 인덱스 구조가 복잡할 수 있음
예: executing이 오래 걸리면 쿼리 자체가 복잡할 수 있음
SHOW PROFILES
의미최근에 실행된 쿼리들의 프로파일 ID와 실행 시간을 보여주는 도구이다. SHOW PROFILE을 적용할 쿼리를 선택할 때 유용하다.
예시
SET profiling = 1;
-- 예시 쿼리 실행
SELECT * FROM users WHERE age = 25;
SELECT * FROM users WHERE age > 30;
-- 프로파일 목록 확인
SHOW PROFILES;실행 결과
Query_ID | Duration (초) | Query | 설명 |
1 | 0.00032 | SELECT * FROM users WHERE age = 25 | 첫 번째 실행된 쿼리 |
2 | 0.00046 | SELECT * FROM users WHERE age > 30 | 두 번째 실행된 쿼리 |
사용 이유
최근 실행된 쿼리 목록을 확인하고 SHOW PROFILE 적용 대상 선택
Query_ID 기준으로 다음 명령어 실행 가능
SHOW PROFILE FOR QUERY 2;
쿼리별 실행 시간 비교 가능. 어떤 쿼리가 오래 걸리는지 확인 가능