[Mysql]Explain실행 계획의 보는 편
개요
MySQL크에리ー오프티마이자ー은 쿼리를 실행할 때 최적의 계획을 세우다. 그 계획을 Database용어로 “실행 계획”(QueryPlan)이라고 하지만, MySQL에서는 “EXPLAIN”키워드를 이용하여 실행 계획에 관한 정보를 조사할 수 있다.
이는 이슈가 발생하는 문제의 쿼리를 이해하고 어떻게 최적화할지에 대한 insight을 제공하는 매우 강력한 수단이 될 수 있지만 불행히도 이를 잘 쓰는 개발자들은 없는 것 같다. (나 포함 TT)
Understanding EXPLAIN’s Output
“EXPLAIN”을 사용하면 쿼리를 실행하기 전에 실행 계획을 분석하고 출력한다. 이하 같은 사례를 들면 EXPLAINSELECT*FROMcategories***************************id:1select_type:SIMPLEtable:categoriestype:ALLpossible_keys:NULLkey_len:NULLref:NULLref:NULLref:1select_type:SIMPLEtable:categoriestype:ALLpossible_keysibleysib
id:쿼리 내에 있는 각 select문에 대한 순차 식별자이다. 이 순서에 select문이 실행된다고 생각하면 된다.select_type:select문 유형을 말한다. 각 타입은 다음과 같다.SIMPLE:사북오리,”union”이 없는 가장 단순한 select문을 말한다.PRIMARY:가장 바깥쪽에 있는 select문이다.DERIVED:from문 안에 있는 사북오리의 select문이다.SUBQUERY: 가장 바깥쪽 select 도어에 있는 서브퀄리이다.DEPENDENTSUBQUERY: 기본적으로 SUBQUERY와 동일한 유형이며 가장 바깥쪽 select문에 “의존성”을 갖는 서브퀄리의 select문이다.UNCACHEABLESUBQUERYUNION : union 문의 두 번째 select문을 말한다.DEPENDENTUNION: 외쿼리에 의존성을 갖는 union문의 두 번째 select문을 말한다.table: 참조되는 테이블을 말한다. type: MySQL이 어떻게 테이블을 조인하는지 보여주는 항목이다. 이는 매우 중요한데 이유는 이 유형을 분석함으로써 어떤 인덱스가 사용되어 사용되지 않았는지 알 수 있고, 이를 통해 어떻게 퀄리가 튜닝되어야 하는지에 대한 insight를 제공하기 위함이다. 각 타입은 다음과 같다.시스템: 0개 또는 1개의 row를 갖는 테이블이다.const: 테이블에 조건을 충족하는 레코드가 하나일 때 정수 취급 eq_ref:primarykey나 uniquenotnull column에서 생성된 인덱스를 사용하여 조인트를 하는 경우이다. const 방식 다음으로 빠른 방법이다.ref: 인덱스로 지정된 컬럼끼리의 ‘=’, ‘<=>’와 같은 연산자에 의한 비교로 이루어지는 조인트이다.index_mergeunique_subquery: 오직 하나의 결과만을 반환하는 “IN”이 포함된 서브퀄리의 경우이다.index_subquery:unique_subquery와 비슷하지만, 여러 결과를 반환하는 range:특정 범위의 rows를 매칭시키는데 인덱스가 사용된 경우이다. BETWEEN이나 IN, 「>」, 「>=」등이 사용될 때이다.all: 조인시 전체 테이블의 모든 row를 스캔하는 경우이다. 물론 성능이 가장 좋지 않다.possible_keys: 테이블에서 row를 매핑시키기 위해 사용 가능한 (사용하지 않고도) 키를 표시한다.key: 실제로 쿼리 실행에 사용된 key 목록이다. 이 항목에는 possible_keys 목록에 나타나지 않은 인덱스도 포함될 수 있다.ref:keycolumn에 지정된 인덱스와 비교되는 column 또는 constants를 표시한다.rows: 결과 산출에서 접근하는 record의 숫자이다. 조인문이나 서브퀄리의 최적화에 있어서 중요한 항목이다.Extra: 실행 계획에서 부가적인 정보를 표시한다.distinct: 조건을 충족하는 레코드를 발견했을 때 동일한 조건을 충족하는 또 다른 레코드가 없는지 검사하지 않는다.notexist: leftjoin 조건을 충족하는 하나의 레코드를 발견했을 때 다른 레코드의 조합은 더 이상 검사하지 않는다.range checked foreach record:최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미. using filesort:mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다. usingindex:select할 때 인덱스 파일만 사용 using temporary:임시 테이블을 사용한다. orderby나 groupby일 때 주로 사용 usingwhere: 조건을 사용한다는 의미.
http://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain-extra-information
출처 : https://denodo1.tistory.com/306 [dBack]