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을 실제로 테스트해보겠습니다.