본문 바로가기

DataBase

DB - 실행계획(explain) 보는방법

DataBase 질의(SQL) 실행계획(explain)을 확인하는 방법을 정리하였다.

 

-- 실행계획
explain [select ... from ... where ...];

-- 실행계획 + mysql의 최종 형태 확인
explain extended [select ... from ... where ...];
show warnings;

구분

= id: select 아이디로 select를 구분하는 번호

 

= select_type: select에 대한 타입

구분 설명
SIMPLE UNION이거나 서브쿼리가 없는 단순 SELECT를 의미
PRIMARY 서브쿼리가 있을 때 가장 바깥쪽에 있는 SELECT
ex)
SELECT * FROM (
    SELECT * FROM tab01
) sub
DERIVED FROM절 안의 서브쿼리
ex)
SELECT * FROM (
    SELECT * FROM tab01
)
DEPENDENT SUBQUERY 외부 쿼리와 상호 연관된 서브쿼리
ex)
SELECT * FROM tab01 t1
WHERE EXISTS (
    SELECT 1 FROM tab02 t2
    WHERE t2.t1_id = t1.id
)

= table: 참조하는 테이블

일반적으로 from절의 테이블명을 노출. Join절로 Alias를 지정하는 경우, Alias명이 나옴 (위의 경우에는 Alias명이 출력)

 

= partitions: 테이블이 파티셔닝이 되어있는경우, 참조하는 파티션 테이블

 

= type: 조인 혹은 조회 타입

(!) 아래로 내려갈수록 성능이 좋지 않다.

구분 설명
system 테이블에 단 한 개의 데이터만 있는 경우
const SELECT에서 Primary Key 혹은 Unique Key를 상수로 조회하는 경우로, 많아야 한 건의 데이터만 있음
eq_ref 조인을 할 때 Primary Key 혹은 Unique Key로 매칭하는 경우
ref 조인을 할 때 Primary Key 혹은 Unique Key가 아닌 Key(index)로 매칭하는 경우
ref_or_null reg와 같지만 NULL이 추가되어 검색되는 경우
index_merge 두 개의 인덱스가 병합되어 검색이 이루어지는 경우
unique_subquery IN절 안의 서브쿼리에서 Primary Key가 오는 특수한 경우
ex)
SELECT * FROM tab01
WHERE col01 IN (
    SELECT primary_key FROM tab01
)
index_subquery unique_subquery와 비슷하나 Primary Key가 아닌 일반 인덱스인 경우
ex)
SELECT * FROM tab01
WHERE col01 IN (
    SELECT key01 FROM tab02
)
range 특정 범위 내에서 인덱스를 사용하여 원하는 데이터를 추출하는 경우로, 데이터가 방대하지 않다면 단순 SELECT에서는 나쁘지 않다
index 인덱스를 처음부터 끝까지 찾아서 검색하는 경우로, 일반적으로 인덱스 풀스캔이라고 한다
all 테이블을 처음부터 끝까지 검색하는 경우로, 일반적으로 테이블 풀스캔이라고 한다

= possible_keys: 데이터를 조회할 때 DB에서 사용할 수 있는 인덱스 리스트

 

= key: 실제로 사용할 인덱스

 

= key_len: 실제로 사용할 인덱스의 길이

 

= ref: key안의 인덱스와 비교하는 컬럼(상수)

 

= rows: 쿼리 실행 시 조사하는 행 수

 

= filtered: mysql 엔진에 의해 필터링되어 제거된 레코드를 제외하고 최종적으로 남은 레코드의 비율(%).

위의 사례같은 경우에는 필터링이 되지않아서 100%이다.

 

= extra: 추가정보

구분 설명
Using Index 커버링 인덱스라고 하며 인덱스 자료 구조를 이용해서 데이터를 추출한다.
Using Where where 조건으로 데이터를 추출한다. type이 all 혹은 index 타입과 함께 표현되면 성능이 좋지 않다는 의미이다.
Using Filesort 데이터 정렬이 필요한 경우로, 메모리 혹은 디스크상에서의 정렬을 모두 포함한다. 결과 데이터가 많은 경우 성능에 직접적인 영향을 미친다.
Using Temporary 쿼리 처리 시 내부적으로 Temporary Table이 사용되는 경우를 의미한다.

 

해당 내용은 mysql 5.5 버전 기준으로 작성된 내용이므로, 8.0버전의 내용은 아래 링크 공홈 문서를 참고

=> https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

참고자료

= MySQL 퍼포먼스 최적화 - 한빛미디어

= https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

 

'DataBase' 카테고리의 다른 글

DB - 복합키 순서  (0) 2022.04.05
DB - Replication  (0) 2022.03.22
DB - 정규화(Normalization)  (0) 2022.03.17
DB - Bulk Insert  (0) 2022.03.13
DB - 인덱스(Index) (B+Tree Index)  (0) 2022.03.06