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 |