Explain?
MySQL에서 실행 계획이 무엇인지 알고 싶을 때 사용하는 명령어
*실행계획 : 사용자가 작성한 SQL이 요구한 사항을 효율적으로 처리하기 위해 옵티마이저가 작업의 방법과 순서를 결정하는 것
사용방법
EXPLAIN [EXTENDED] SELECT ... FROM ... WHERE ...
id : 어떤 SELECT문을 나타내는 지를 알려주는 것으로 순서에 따라 순차적으로 번호가 부여된다.
select_type : select문의 유형
- SIMPLE : Union 이나 Sub Query 가 없는 단순 SELECT 문
- PRIMARY : Sub Query를 사용할 경우 Sub Query의 외부에 있는 쿼리(첫번째 쿼리) UNION 을 사용할 경우 UNION의 첫 번째 SELECT 쿼리
- DERIVED : from 문 안에있는 서브쿼리의 select 문
- SUBQUERY : Sub Query 또는 Sub Query를 구성하는 여러 쿼리 중 첫 번째 SELECT문
- DEPENDENT SUBQUERY : Sub Query 와 동일하나, 외곽쿼리에 의존적
- UNCACHEABLE SUBQUERY : Sub Query와 동일하지만 공급되는 모든 값에 대해 Sub Query를 재처리. 외부쿼리에서 공급되는 값이 같아도 Cache된 결과를 사용할 수 없음
- UNION : UNION 쿼리에서 Primary를 제외한 나머지 SELECT
- DEPENDENT UNION : UNION 과 동일하나, 외부쿼리에 의존적
table : 접근하는 테이블. 테이블 이름이나 SQL에서 지정된 별명 같은 값을 나타낸다.
type : MySQL이 어떤식으로 테이블들을 조인하는지를 나타내는 항목이다. 해당 타입을 분석함으로써 어떤 인덱스가 사용되는지 알 수 있고, 이를 통해 쿼리 튜닝에 대한 insight를 제공한다.
- system : 테이블에 단 한개의 데이터만 있는 경우
- const : 테이블에 조건을 만족하는 레코드가 하나일 때, 상수 취급
- eq_ref : primary key나 unique not null column으로 생성된 인덱스를 사용해 조인을 하는 경우. (const 방식 다음으로 빠른 방법)
- ref : 인덱스로 지정된 컬럼끼리의 '=' , '<=>' 와 같은 연산자를 통한 비교로 수행되는 조인
- index_merge :두 개의 인덱스가 병합되어 검색이 이루어지는 경우
- unique_subquery : 오직 하나의 결과만을 반환하는 'IN'이 포함된 서브쿼리의 경우
- index_subquery : unique_subquery와 비슷하지만 여러개의 결과를 반환
- range : 특정한 범위의 rows들을 매칭시키는데 인덱스가 사용된 경우 (BETWEEN이나 IN, '>', '>=' 등이 사용될 때)
- all : 테이블의 모든 row를 스캔하는경우
- index : 모든 인덱스를 검색하는 경우
possible_keys : 쿼리에서 접근하는 컬럼들과 사용된 비교 연산자들을 바탕으로 어떤 인덱스를 사용할 수 있는지 표시
key : 실제적으로 쿼리 실행에 사용된 key의 목록이다. 이 항목에는 possible_keys 목록에 나타지 않은 인덱스도 포함 될 수 있다.
ref : 테이블에 접근하는 방법을 최적화 하기 위해 어떤 인덱스를 사용하기로 결정했는 지를 나타낸다.
rows : 원하는 행을 찾기 위해 얼마나 많은 행을 읽어야 할 지에 대한 예측값을 의미한다. 조인문이나 서브쿼리 최적화에 있어서 중요한 항목이다.
Extra : 실행계획에 있어서 부가적인 정보를 보여준다.
- distinct : 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음.
- not exist : left join 조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 이상 검사하지 않음
- range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미.
- using filesort : 데이터 정렬이 필요한 경우로 메모리 혹은 디스크상에서의 정렬을 모두 포함.
- using index : 커버링 인덱스라고 하며 인덱스 자료 구조를 이용해서 데이터를 추출
- using temporary : 쿼리 처리 시 내부적으로 임시 테이블이 사용되는 경우를 의미함
- using where : where 조건으로 데이터를 추출
* MySQL EXPLAIN상 일반적으로 데이터가 많은 경우 Using Filesort와 Using Temporary 상태는 성능이 떨어짐
'DB' 카테고리의 다른 글
DynamoDB? (0) | 2021.07.06 |
---|---|
Connection pool? (0) | 2021.07.06 |
[DB] Sharding (0) | 2021.06.24 |
[DB]Partitioning (0) | 2021.06.24 |
댓글