EXPLAIN
명령어는 옵티마이저가 생성한 최적화 실행 절차를 사용자가 확인할 수 있게 정보를 제공해준다.
접근 방식 | 설명 |
---|---|
const | 기본 키 또는 고유키에 의한 loockup(등가비교), 조인이 아닌 가장 외부의 테이블에 접근 하는 방식, 결과는 항상 1행이다. 단 기본 키, 고유 키를 사용하고 있으므로 범위 검색으로 지정하는 경우 const가 되지 않는다 |
system | 테이블에 1행밖에 없는 경우의 특수한 접근 방식 |
ALL | 전체 행 스캔, 테이블의 데이터 전체에 접근한다. |
index | 인덱스 스캔, 테이블의 특정 인덱스의 전체 엔트리에 접근한다. |
eq_ref | 조인이 내부 테이블로 접근할 때 기본키 또는 공유 키에 의한 lookup이 일어난다. const와 비슷하지만 조인의 내부 테이블에 접근한다는 점이 다르다. 조인 두 번째 테이블(드라이빙 테이블 이외)은 반드시 1건의 레코드만 반환헤야 한다. |
ref | 고유 키가아닌 인덱스에 대한 등가비교, 여러 개 행에 접근할 가능성이 있다. 인덱스 조건에 관계없이 동등(Equal) 조건으로 검색 시 사용. |
ref_or_null | ref와 마찬가지로 인덱스 접근 시 맨 앞에 저장되어 있는 NULL의 엔트리를 검색한다. |
range | 인덱스 특정 범위의 행에 접근한다 |
fulltext | fulltext 인덱스를 사용한 검색 |
index_merge | 여러 개인스턴스를 사용해 행을 가져오고 그 결과를 통합한다. |
unique_subquery | IN 서브쿼리 접근에서 기본 키 또는 고유 키를 사용한다. 이 방식은 쓸데 없는 오버헤드를 줄여 상당히 빠르다. |
index_subquery | unique_sunquery와 거의 비슷하지만 고유한 인덱스를 사용하지 않는 점이 다르다. 이 접근 방식도 상당히 빠르다 |
index
:인덱스가 있는 컬럼이 아니거나 컬럼 지정 우선순위가 일치하지 않는 경우 index
를 타지 못함. ref
를 통해 인덱스에 접근하게 한다.
range
:
접근 방식과 같이 효율적으로 인덱스의 필요한 부분만 읽는 것
Extra | 설명 |
---|---|
Using where | 접근 방식을 설명한 것으로, 테이블에서 행을 가져온 후 추가적으로 검색조건을 적용해 행의 범위를 축소한 것을 표시한다. |
Using index | 테이블에는 접근하지 않고 인덱스에서만 접근해서 쿼리를 해결하는 것을 의미한다. 커버링 인덱스로 처리됨 index only scan이라고도 부른다. (커버링 인덱스 : 쿼리를 실행하기 위해 필요한 데이터가 모두 포함된 인덱스) |
Using index for group-by | Using index와 유사하지만 GROUP BY가 포함되어 있는 쿼리를 커버링 인덱스로 해결할 수 있음을 나타낸다 |
Using filesort | ORDER BY 인덱스로 해결하지 못하고, filesort(MySQL의 quick sort)로 행을 정렬한 것을 나타낸다. |
Using temporary | 암묵적으로 임시 테이블이 생성된 것을 표시한다. |
Using where with pushed | 엔진 컨디션 pushdown 최적화가 일어난 것을 표시한다. 현재는 NDB만 유효 |
Using index condition | 인덱스 컨디션 pushdown(ICP) 최적화가 일어났음을 표시한다. ICP는 멀티 칼럼 인덱스에서 왼쪽부터 순서대로 칼럼을 지정하지 않는 경우에도 인덱스를 이용하는 실행 계획이다. |
Using MRR | 멀티 레인지 리드(MRR) 최적화가 사용되었음을 표시한다. |
Using join buffer(Block Nested Loop) | 조인에 적절한 인덱스가 없어 조인 버퍼를 이용했음을 표시한다. |
Using join buffer(Batched Key Access) | Batched Key Access(BKAJ) 알고리즘을 위한 조인 버퍼를 사용했음을 표시한다. |
참고
Mysql Explain
Real MySQL 실행계획 < real MySQL의 쿼리최적화 부분 정리되어 있음