쿼리 성능 개선시 꼭 봐야 할 실행계획 보는 방법에 대해 알아보겠습니다

MySQL 실행계획 띄우는 법
EXPLAIN
SELECT *
FROM EMP
;
이렇게 실행계획을 볼 쿼리 앞에 EXPLAIN을 날리면
이런식으로 결과가 뜹니다
이 실행계획을 어떻게 보는지 컬럼 하나씩 알아보도록 하겠습니다
▶ id
SELECT 쿼리 내에서의 일련번호입니다
한 SELECT 쿼리 내에 여러 개의 SELECT문이 서브쿼리 형태로 들어가면 ID 값이 auto increment됩니다.
▶ select_type
SIMPLE
단순 SELECT문 사용시 나오는 유형
(UNION이나 서브쿼리 X)
PRIMARY
가장 외곽에 있는 SELECT
UNION
두번째나 나중에 사용된 UNION 쿼리
DEPENDENT UNION
두번째나 나중에 사용된 UNION 쿼리, 바깥쪽 쿼리에 의존한 UNION
UNION RESULT
UNION의 결과물
SUBQUERY
서브쿼리에서 첫번째 SELECT
DEPENDENT SUBQUERY
서브쿼리의 첫번째 select, 바깥 쪽 쿼리에 의존
DERIVED
파생된 테이블
UNCACHEABLE SUBQUERY
결과를 캐시할 수 없고 외부 쿼리의 각 행에 대해 재평가해야 하는 하위 쿼리
MATERIALIZED
구체화된 서브쿼리
▶ table
출력 행이 참조하는 테이블의 이름입니다.
▶ type
조인 또는 조회 타입입니다
system | 테이블에 단 한개의 데이터만 있는 경우 |
const | select 에서 조건을 만족하는 row가 하나일 때 (const 테이블은 한 번만 읽기 때문에 매우 빠름) |
eq_ref | 조인에서 인덱스의 모든 부분을 사용하고 인덱스가 pk 또는 unique not null 인덱스일 때 사용 됨 |
ref | 키가 PRIMARY KEY또는 UNIQUE인덱스가 아닌 경우(즉, 조인이 키 값을 기반으로 단일 행을 선택할 수 없는 경우)에 사용됩니다. |
ref_or_null | 이 조인 유형은 ref와 비슷하지만 MySQL이 NULL값을 포함하는 행에 대해 추가 검색을 수행 |
index_merge | 인덱스 병합 최적화가 사용됨을 나타냅니다. key출력 행의 열에는 사용된 인덱스 목록, key_len에는 사용된 인덱스의 가장 긴 키 부분 목록이 포함 |
range | 특정 범위 내에서 인덱스를 사용하여 원하는 데이터를 추출하는 경우 |
index | 인덱스 풀스캔. 인덱스를 처음부터 끝까지 찾아서 검색 |
all | 테이블 풀스캔. 테이블을 전부 검색하는 경우 |
▶ possible_keys
테이블에서 행을 찾기 위해 선택할 수 있는 인덱스를 나타냅니다.
이 컬럼에 뜨는 키는 실제 쿼리를 실행될 때 사용되는 키가 아닌 사용 가능한 후보키들입니다
NULL이라고 뜨면 사용 가능한 인덱스가 없는겁니다
▶ key
실제 쿼리가 실행될 때 사용되는 인덱스입니다.
▶ key_len
쿼리가 실행될 떄 인덱스의 각 레코드에서 몇 바이트까지 사용됐는지 알려주는 컬럼입니다.
▶ ref
쿼리가 실행될 때 키와 함께 사용된 컬럼이나 상수값을 나타냅니다
▶ rows
결과값을 찾기 위해 몇 개의 행을 읽어야 하는지 예측값을 의미합니다
▶ extra
추가정보
종류 | 설명 |
using index | 인덱스를 이용해서 데이터 추출 |
using where | where 조건으로 데이터 추출 |
using temporary | 쿼리 실행시 내부적으로 가상 테이블이 생성되는 것 |
using filesort | 정렬 |
using index condition | where절의 인덱스를 이용한 조건에 체크 조건이 있을 경우 체크 조건 처리를 스토리지 엔진이 하도록 전달 |