본문 바로가기

카테고리 없음

MySQL Index (3) EXPLAIN

EXPLAIN 을 이용해서 MySQL이 쿼리를 어떻게 실행하는 지에 대한 정보를 출력할 수 있습니다.

 

 

EXPLAIN으로 실행한 결과입니다.

아래 MySQL의 문서에 출력 내용에 대해서 설명이 되어있습니다.

 

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

 

MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format

8.8.2 EXPLAIN Output Format The EXPLAIN statement provides information about how MySQL executes statements. EXPLAIN works with SELECT, DELETE, INSERT, REPLACE, and UPDATE statements. EXPLAIN returns a row of information for each table used in the SELECT s

dev.mysql.com

 

id

select 아이디로 SELECT를 구분하는 번호

 

 

select_type

select문의 종류를 표시합니다.

 

SIMPLE 단순 select ( union이나 서브쿼리를 사용하지 않음 )
PRIMARY 가장 외곽에 있는 select문
UNION union에서의 두번째 혹은 나중에 따라오는 select문
DEPENDENT UNION union에서의 두번째 혹은 나중에 따라오는 select문, 외곽 쿼리에 의존적이다.
UNION RESULT union의 결과물
SUBQUERY 서브쿼리의 첫번째 select
DEPENDENT SUBQUERY 서브쿼리의 첫번째 select, 바깥 쪽 쿼리에 의존적이다.
DERIVED from절의 서브쿼리
DEPENDENT DERIVED 다른 테이블에 종속된 Derived(파생) 테이블
MATERIALIZED
쿼리 결과가 미리 저장된 SUBQUERY
UNCACHEABLE SUBQUERY 결과를 캐시할 수 없고 외부 쿼리의 각 행에 대해 다시 평가해야 하는 SUBQUERY
UNCACHEABLE UNION
캐시할 수 없는 하위 쿼리에 속하는 UNION에서 두 번째 또는 이후의 SELECT(UNCACHEABLE SUBQUERY 참조)

 

table

참조하는 테이블

 

 

partitions

쿼리와 일치하는 레코드의 파티션입니다. 파티션되지 않은 테이블의 경우 값은 NULL입니다.

 

type

조인관련 정보가 표시된다.

 

system 테이블에 row가 하나인 경우
const const는 PRIMARY KEY 또는 UNIQUE 인덱스의 모든 부분을 상수 값과 비교할 때 사용
eq_ref 이전 테이블의 각 행 조합에 대해 이 테이블에서 하나의 행을 읽습니다. system 및 const 유형 외에 가능한 최상의 조인 유형입니다. 인덱스의 모든 부분이 조인에서 사용되고 인덱스가 PRIMARY KEY 또는 UNIQUE NOT NULL 인덱스인 경우에 사용됩니다.
ref 조인에서 키의 가장 왼쪽 접두사 만 사용하거나 키가 PRIMARY KEY또는 UNIQUE인덱스 가 아닌 경우 (즉, 조인이 키 값을 기반으로 단일 행을 선택할 수없는 경우) 사용된다. 사용되는 키가 몇 개의 행과 만 일치하는 경우 이는 좋은 조인 유형이다.
fulltext fulltext 색인을 사용하여 수행된다.
ref_or_null 이 조인 유형은 비슷 ref하지만 MySQL이 NULL값 을 포함하는 행을 추가로 검색한다는 점이 다르다. 이 조인 유형 최적화는 하위 쿼리를 해결하는 데 가장 자주 사용된다.
index_merge 두 개의 인덱스가 병합되어 검색이 이루어지는 경우

인덱스 병합 최적화가 적용되는 조인타입. 이 경우, key컬럼은 사용된 인덱스의 리스트를 나타내며 key_len 컬럼은 사용된 인덱스중 가장 긴 key명을 나타낸다.
unique_subquery 다음과 같이 IN 절 안의 서브쿼리에서 Primary Key가 오는 특수한 경우
SELECT *
FROM tab01
WHERE col01 IN (SELECT Primary Key FROM tab01);
index_subquery unique_subquery와 비슷하나 Primary Key가 아닌 인덱스인 경우
SELECT *
FROM tab01
WHERE col01 IN (SELECT key01 FROM tab02);
range 특정 범위 내에서 인덱스를 사용하여 원하는 데이터를 추출하는 경우로, 데이터가 방대하지 않다면 단순 SELECT 에서는 나쁘지 않음

인덱스를 사용하여 주어진 범위 내의 행들만 추출된다. key 컬럼은 사용된 인덱스를 나타내고 key_len은 사용된 가장 긴 key부분을 나타낸다. ref 컬럼은 이 타입의 조인에서 NULL 이다. range 타입은 키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용된다.
index 인덱스를 처음부터 끝까지 찾아서 검색하는 경우로, 일반적으로 인덱스 풀스캔이라고 함

이 타입은 인덱스가 스캔되는걸 제외하면 ALL과 같다. 보통 인덱스 파일이 데이터 파일보다 작기 때문에 ALL보다 빠릅니다.
ALL 이전 테이블과의 조인을 위해 풀스캔이 된다. 만약 조인에 쓰인 첫 테이블이 고정이 아니라면 비효율적이다. 그리고 대부분의 경우 아주 느리며, 보통 상수값이나 상수인 컬럼값으로 row를 추출하도록 인덱스를 추가하여 ALL 타입을 피할 수 있습니다.

 


possible_keys

 

이 컬럼값은 MySQL이 해당 테이블의 검색에 사용할 수 있는 인덱스들을 나타낸다.

 

key

이 컬럼은 MySQL이 실제 사용한 key(index)를 나타낸다.

 

key_len

이 컬럼은 MySQL이 사용한 인덱스의 길이를 나타낸다. key 컬럼의 값이 NULL이면 이 컬럼의 값도 NULL이다. 이 값으로 MySQL이 실제로 키를 얼마나 사용하였는지 알 수 있다.

 

ref

이 컬럼은 행을 추출하는데 키와 함께 사용된 컬럼이나 상수값을 나타낸다.

 

const WHERE 조건의 조건값을 고정값으로 설정했다는 의미
func 함수의 실행결과를 조건값으로 사용한다는 의미

 

rows

 

이 값은 쿼리 수행에서 MySQL이 찾아야하는 데이터행 수의 예상값을 나타낸다. 추정 수치이며 항상 정확하지 않다.

 

filtered

filtered는 테이블 조건으로 필터링된 테이블 행의 예상 백분율을 나타냅니다. 최대값은 100이며 행 필터링이 발생하지 않았음을 의미합니다. 100에서 감소하는 값은 필터링 양이 증가함을 나타냅니다. 행은 검사된 행의 예상 수를 표시하고 행 × 필터링은 다음 테이블과 결합되는 행 수를 표시합니다. 예를 들어, 행이 1000이고 필터링된 행이 50.00(50%)인 경우 다음 테이블과 결합할 행 수는 1000 × 50% = 500입니다.

 

Extra

이 칼럼에는 MySQL이 쿼리를 어떻게 해석하는지에 대한 추가 정보가 들어있다.

 

 

이상으로 MySQL의 EXPLAIN 매뉴얼을 살펴보았습니다.

테스트 테이블을 이용해서 EXPLAIN을 실제로 테스트해보겠습니다.