DBMS/MySQL & MariaDB
Mysql EXPLAIN
이제이b
2024. 6. 26. 08:05
SELECT TYPE
SELECT TYPE 명 | 설명 |
SIMPLE | 일반적인 SELECT 문. 복잡한 UINON 이나 서브쿼리가 없는 경우 단순 테이블에서 데이터를 가져와 결과 반환 하므로 가장 빠름 |
PRIMARY | 복잡한 쿼리에서의 최상의 쿼리문의 경우 |
SUBQUERY | SELECT 문 안에서 서브쿼리를 사용한 경우 |
DEPENDENT SUBQUERY | 서브쿼리가 외부 쿼리로부터 값을 참조하여 실행한 경우 |
DERIVED | FROM절에서 쓰인 서브쿼리 (인라인 뷰) |
UNION | UNION 또는 UNION ALL 사용한 경우 |
DEPENDENT UNION | UNION의 서브쿼리가 외부 쿼리로부터의 값을 참고하여 실행하는 경우 |
UNION RESULT | UNION 결과로 생성된 임시 테이블에 대한 SELECT 문을 실행하는 경우 |
JOIN TYPE
TYPE 명 | 설명 |
system | 테이블에 한 개의 row 만 있는 경우 |
const | Unique key 혹은 Primary Key를 상수로 조회하는 경우 (한 건만 존재) |
eq_ref | 다른 테이블과 조인 시 Primary Key를 이용 (한 건 조회) |
ref | 인덱스에 설정된 모든 컬럼을 조회 조건을 사용 사용되는 키 조건이 몇 개의 행에 일치하는 경우. 최소 2개 이상 |
fulltext | 풀 텍스트 인덱스를 사용하여 수행 |
ref_or_null | ref 와 동일하지만 null 값이 포함된 경우 MySQL 의 경우 NULL 에 대해서도 인덱스를 활용할 수 있고 이때 가장 앞에 정렬 됨 |
index_merge | 단일 테이블의 여러 범위의 행을 스캔한 결과를 하나로 병합 |
unique_subquery | IN 절의 서브쿼리에 eq_req 적용 |
index_subquery | IN 적읠 서브쿼리에 PK 가 아닌 인덱스 적용 |
range | 인덱스의 지정 범위 안의 행을 검색 (BETWEEN, LIKE, IN, <, >, <=. >=.. ) |
index | 단일 인덱스의 일부만 충족할 경우 테이블 풀 스캔보다는 유리하지만 물리적인 인덱스 블록을 처음부터 끝까지 탐색 |
all | 테이블 풀스캔 전체 테이블 중 10~20퍼센트를 조호할 때는 오히려 유리할 때도 있음 |
EXTRA TYPE
extra는 SQL문을 어떻게 수행할 것인지 나타냄.
보통 Using temporary, Using filesort 정도가 튜닝 대상.
Extra 명 | 설명 |
Using index | 인덱스를 사용하여 쿼리를 처리하는 것. 물리적으로 인덱스의 사이즈가 작고 정렬이 되어 있다면 성능상으로 효율적이라고 판단. |
Using index for group-by | Group By 나 Distinct 구문으로 그룹화 작업이 수행될 때 인덱스를 사용하는 것. 그룹화 작업을 최적화하거나 인덱스를 활용하여 성능을 개선할 수 있는지 확인 |
Using where Using index condition |
WHERE 절 처리 방식을 나타냄. 필요한 경우 WHERE 절 조건 항목들을 최적화하거나, 불피요한 조건을 줄이는 등 작업 고려 |
Using sort_union() | 병합 작업에서 정렬을 수행하는 것. 성능상 문제가 될 여지가 있다면 정렬을 최적화 필요 |
Using join buffer (Block Nested Loop, Batched Key Access) |
조인 수행 중 중간 데이터 결과를 저장하는 조인 버퍼를 사용. 성능 개선을 위해 조인 버퍼 크기를 조정하거나 인덱스를 사용하여 조인 작업 최적화 |
Using temporary | 데이터 중간 결과를 저장하기위해 임시 테이블을 사용. 임시 테이블은 메모리나 디스크에 생성되어 쿼리 결과를 저장하는 용도로 사용. 보통 Distinct, Group By, Order By 구문 등이 포함된 경우 출력 |
Using filesort | 정렬 작업을 위해 파일 정렬를 수행. 이미 정렬된 인덱스를 사용하면 추가 정렬 작업이 필요 없지만, 인덱스를 사용하지 못할 경우 정렬을 위해 메모리에 올리므로 성능에 부담을 줄 수 있음. 정렬이 필요한 경우 인덱스 검토 (이미 정렬된 인덱스를 생성)하거나 애플리케이션에서 정렬을 하는 방식등 고려 |