[SQL 튜닝] EXPLAIN의 type과 extra 컬럼

yed·2022년 2월 16일
0

EXPLAIN 명령어는 옵티마이저가 생성한 최적화 실행 절차를 사용자가 확인할 수 있게 정보를 제공해준다.


type

  • 테이블에서 어떻게 행데이터(row)를 가져올것인가를 의미한다.
접근 방식설명
const기본 키 또는 고유키에 의한 loockup(등가비교), 조인이 아닌 가장 외부의 테이블에 접근 하는 방식, 결과는 항상 1행이다. 단 기본 키, 고유 키를 사용하고 있으므로 범위 검색으로 지정하는 경우 const가 되지 않는다
system테이블에 1행밖에 없는 경우의 특수한 접근 방식
ALL전체 행 스캔, 테이블의 데이터 전체에 접근한다.
index인덱스 스캔, 테이블의 특정 인덱스의 전체 엔트리에 접근한다.
eq_ref조인이 내부 테이블로 접근할 때 기본키 또는 공유 키에 의한 lookup이 일어난다. const와 비슷하지만 조인의 내부 테이블에 접근한다는 점이 다르다. 조인 두 번째 테이블(드라이빙 테이블 이외)은 반드시 1건의 레코드만 반환헤야 한다.
ref고유 키가아닌 인덱스에 대한 등가비교, 여러 개 행에 접근할 가능성이 있다. 인덱스 조건에 관계없이 동등(Equal) 조건으로 검색 시 사용.
ref_or_nullref와 마찬가지로 인덱스 접근 시 맨 앞에 저장되어 있는 NULL의 엔트리를 검색한다.
range인덱스 특정 범위의 행에 접근한다
fulltextfulltext 인덱스를 사용한 검색
index_merge여러 개인스턴스를 사용해 행을 가져오고 그 결과를 통합한다.
unique_subqueryIN 서브쿼리 접근에서 기본 키 또는 고유 키를 사용한다. 이 방식은 쓸데 없는 오버헤드를 줄여 상당히 빠르다.
index_subqueryunique_sunquery와 거의 비슷하지만 고유한 인덱스를 사용하지 않는 점이 다르다. 이 접근 방식도 상당히 빠르다
  • index :
    인덱스를 처음부터 끝까지 읽는 인덱스 풀 스캔으로 효율적인 방법은 아니다.
    풀 테이블 스캔보다는 효율적.
    인덱스에 포함된 컬럼으로만 처리할 수 있는 경우
    인덱스를 이용해 정렬이나 그룹핑 작업이 가능한 경우
    range 나 const 또는 ref 와 같은 접근 방식으로 인덱스를 사용하지 못하는 경우
  • 인덱스가 있는 컬럼이 아니거나 컬럼 지정 우선순위가 일치하지 않는 경우 index를 타지 못함. ref를 통해 인덱스에 접근하게 한다.

  • range :
    접근 방식과 같이 효율적으로 인덱스의 필요한 부분만 읽는 것


extra

  • 쿼리 실행 계획에서 성능에 관련된 정보 제공
Extra설명
Using where접근 방식을 설명한 것으로, 테이블에서 행을 가져온 후 추가적으로 검색조건을 적용해 행의 범위를 축소한 것을 표시한다.
Using index테이블에는 접근하지 않고 인덱스에서만 접근해서 쿼리를 해결하는 것을 의미한다. 커버링 인덱스로 처리됨 index only scan이라고도 부른다. (커버링 인덱스 : 쿼리를 실행하기 위해 필요한 데이터가 모두 포함된 인덱스)
Using index for group-byUsing index와 유사하지만 GROUP BY가 포함되어 있는 쿼리를 커버링 인덱스로 해결할 수 있음을 나타낸다
Using filesortORDER 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의 쿼리최적화 부분 정리되어 있음

profile
6개월 국비과정 기록하기

0개의 댓글