0176

BE

[MySQL] MySQL 성능 디버깅, 이 3개면 충분하다

MySQL에서 쿼리 성능을 분석하거나 최적화할 때, 꼭 알아야 할 세 가지 명령어가 있다.

바로 EXPLAIN, SHOW PROFILE, SHOW PROFILES이다.

각각의 역할과 사용 방법, 결과 해석법까지 살펴보자.


EXPLAIN

  • 의미: 쿼리가 실행되었을 때, MySQL이 어떤 방식으로 처리할지 "실행계획"을 보여주는 도구이다.

  • 예시

code
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, 실행 단계 등)

  • 예시

code
-- 쿼리 실행
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을 적용할 쿼리를 선택할 때 유용하다.

  • 예시

code
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;

    • 쿼리별 실행 시간 비교 가능. 어떤 쿼리가 오래 걸리는지 확인 가능