[데이터베이스] 쿼리 실행계획 확인하기(Mysql)

Yoon Uk·2023년 8월 10일
0

데이터베이스

목록 보기
13/20
post-custom-banner

명령어

explain 명령어 뒤에 쿼리문을 작성하면 해당 쿼리의 실행 계획(Query Plan)을 확인할 수 있습니다.

explain 쿼리문

실행 계획(Query Plan)

실행 계획(Query Plan)이란 쿼리가 데이터에 접근하는 동작과정과 접근 계획을 말합니다.

항목

항목설명
id쿼리 안에 있는 select 문에 대한 순차적인 식별자
select_typeselect 문의 유형
table참조 되거나 참조 하고 있는 table
partitions테이블의 파티션중 어떤 파티션을 사용했는지 등의 정보
typetable 이 join 되고 있는 방식
possible_keys테이블에서 row 를 매핑시키기 위한 key 목록을 나열
key실제적으로 쿼리 실행에 사용된 key 의 목록
key_lenMySQL이 사용한 인덱스의 길이
refkey column 에 지정된 인덱스와 비교되는 column 또는 constant
rows결과 산출에 있어서 접근되는 record 의 수
filteredMySQL 엔진에 의해 필터링되어 제거된 레코드를 제외하고 최종적으로 남은 레코드의 비율(%)
extra실행계획에 있어서 SQL이 해석되어지는 부가적인 정보

항목 설명

위의 실행 계획(Query Plan) 항목 중 중요한 몇 가지만 정리하겠습니다.

select_type

  • SIMPLE
    단순 select ( union이나 서브쿼리를 사용하지 않음 )

  • PRIMARY
    가장 외곽에 있는 select문

  • UNION
    union 된 쿼리문 중 두번째 혹은 그 뒤의 select문

  • DEPENDENT UNION
    union 된 쿼리 중 외곽 쿼리에 의존적

  • UNION RESULT
    union의 결과물

  • SUBQUERY
    서브쿼리의 첫번째 select

  • DEPENDENT SUBQUERY
    서브쿼리의 첫번째 select, 바깥 쪽 쿼리에 의존적이다.

  • DERIVED
    from절의 서브쿼리

type

조인타입을 나타냅니다.
속도와 아주 밀접한 항목입니다.

아래로 갈 수록 좋지 않습니다.

  • system
    테이블에 단 하나의 행만 존재(=시스템 테이블).
    const 조인의 특별한 형태입니다.

  • const
    하나의 매치되는 행만 존재하는 경우.
    하나의 행이기 때문에 상수로 간주되며, 한번만 읽어들이기 때문에 무척 빠릅니다.

  • eq_ref
    조인수행을 위해 각 테이블에서 하나의 행만이 읽혀지는 형태.
    const 타입 외에 가장 훌륭한 조인 타입입니다.

  • ref
    조인이 키 값을 기반으로 단일 행을 선택할 수 없는 경우.
    사용되는 키가 몇 개의 행만 일치하는 경우 이는 좋은 조인 유형입니다.

  • fulltext
    fulltext index를 사용하여 수행됩니다.

  • ref_or_null
    이 조인 유형은 ref와 비슷하지만 MySQL이 NULL값 을 포함하는 행을 추가로 검색합니다.
    하위 쿼리를 해결하는 데 자주 사용됩니다.

  • index_merge
    인덱스 병합 최적화가 적용되는 조인타입 입니다.

  • range
    인덱스를 사용하여 주어진 범위 내의 행들만 추출됩니다.
    ref 컬럼은 이 타입의 조인에서 NULL 입니다.
    range 타입은 키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용됩니다.

  • index
    이 타입은 인덱스가 스캔되는걸 제외하면 ALL과 같습니다.
    보통 인덱스 파일이 데이터 파일보다 작기 때문에 ALL보다 빠릅니다.

  • ALL
    이전 테이블과의 조인을 위해 풀스캔이 됩니다.
    만약 조인에 쓰인 첫 테이블이 고정이 아니라면 비효율적입니다. 그리고 대부분의 경우 아주 느리며, 보통 상수값이나 상수인 컬럼값으로 row를 추출하도록 인덱스를 추가하여 ALL 타입을 피할 수 있습니다.

참고

Real MySQL 8.0(백은빈, 이성욱 지음)
https://gradle.tistory.com/4
https://weicomes.tistory.com/154

post-custom-banner

0개의 댓글