Loading...
MySQL 9.5 Reference Manual 9.5의 10.8.3 Extended EXPLAIN Output Format의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
EXPLAIN statement는 EXPLAIN output의 일부는 아니지만, EXPLAIN 이후에 SHOW WARNINGS statement를 실행함으로써 볼 수 있는 추가(“extended”) 정보를 생성합니다. Extended 정보는 SELECT, DELETE, INSERT, REPLACE, UPDATE statement에 대해 사용 가능합니다.
SHOW WARNINGS output의 Message 값은 optimizer가 SELECT statement에서 테이블 및 컬럼 이름을 어떻게 한정(qualify)하는지, rewriting 및 최적화 규칙이 적용된 후 SELECT가 어떻게 보이는지, 그리고 최적화 프로세스에 대한 다른 메모를 표시합니다.
EXPLAIN 이후에 SHOW WARNINGS statement로 표시할 수 있는 extended 정보는 SELECT statement에 대해서만 생성됩니다. SHOW WARNINGS는 다른 explain 가능한 statement (DELETE, INSERT, REPLACE, UPDATE)에 대해서는 빈 결과를 표시합니다.
다음은 extended EXPLAIN output의 예입니다:
1mysql> EXPLAIN 2 SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G 3*************************** 1. row *************************** 4 id: 1 5 select_type: PRIMARY 6 table: t1 7 type: index 8possible_keys: NULL 9 key: PRIMARY 10 key_len: 4 11 ref: NULL 12 rows: 4 13 filtered: 100.00 14 Extra: Using index 15*************************** 2. row *************************** 16 id: 2 17 select_type: SUBQUERY 18 table: t2 19 type: index 20possible_keys: a 21 key: a 22 key_len: 5 23 ref: NULL 24 rows: 3 25 filtered: 100.00 26 Extra: Using index 272 rows in set, 1 warning (0.00 sec) 28 29mysql> SHOW WARNINGS\G 30*************************** 1. row *************************** 31 Level: Note 32 Code: 1003 33Message: /* select#1 */ select `test`.`t1`.`a` AS `a`, 34 <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in 35 ( <materialize> (/* select#2 */ select `test`.`t2`.`a` 36 from `test`.`t2` where 1 having 1 ), 37 <primary_index_lookup>(`test`.`t1`.`a` in 38 <temporary table> on <auto_key> 39 where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a 40 IN (SELECT t2.a FROM t2)` from `test`.`t1` 411 row in set (0.00 sec)
SHOW WARNINGS가 표시하는 statement에는 쿼리 rewriting 또는 optimizer 동작에 대한 정보를 제공하기 위한 특수 마커가 포함될 수 있으므로, 해당 statement는 반드시 유효한 SQL일 필요는 없으며, 실행을 위한 것이 아닙니다. Output에는 optimizer가 수행한 동작에 대해 추가적인 비-SQL 설명 메모를 제공하는 Message 값의 row가 포함될 수도 있습니다.
다음 목록은 SHOW WARNINGS에 의해 표시되는 extended output에 나타날 수 있는 특수 마커를 설명합니다:
<auto_key>Temporary 테이블에 대해 자동으로 생성된 키입니다.
<cache>(expr)해당 표현식(예: 스칼라 서브쿼리)은 한 번 실행되고, 그 결과 값은 나중에 사용하기 위해 메모리에 저장됩니다. 결과가 여러 값으로 구성되는 경우, temporary 테이블이 생성될 수 있으며 대신 <temporary table>이 표시됩니다.
<exists>(query fragment)서브쿼리 프레디킷은 EXISTS 프레디킷으로 변환되고, 서브쿼리는 EXISTS 프레디킷과 함께 사용할 수 있도록 변환됩니다.
<in_optimizer>(query fragment)이것은 사용자에게 의미가 없는 내부 optimizer 객체입니다.
<index_lookup>(query fragment)쿼리 프래그먼트는 적합한(row를 만족하는) row를 찾기 위해 인덱스 조회를 사용하여 처리됩니다.
<if>(condition, expr1, expr2)Condition이 참이면 _expr1_로 평가되고, 그렇지 않으면 _expr2_로 평가됩니다.
<is_not_null_test>(expr)표현식이 NULL로 평가되지 않는지를 검증하는 테스트입니다.
<materialize>(query fragment)서브쿼리 머티리얼라이제이션이 사용됩니다.
서브쿼리를 평가한 결과를 보유하기 위해 머티리얼라이즈된 내부 temporary 테이블의 컬럼 _col_name_에 대한 참조입니다.
<primary_index_lookup>(query fragment)쿼리 프래그먼트는 적합한 row를 찾기 위해 프라이머리 키 조회를 사용하여 처리됩니다.
<ref_null_helper>(expr)이것은 사용자에게 의미가 없는 내부 optimizer 객체입니다.
/* select#N */ select_stmt이 SELECT는 extended가 아닌 EXPLAIN output에서 id 값이 _N_인 row와 연관됩니다.
outer_tables semi join (inner_tables)Semijoin 연산입니다. _inner_tables_는 pull-out되지 않은 테이블을 보여줍니다. Optimizing IN and EXISTS Subquery Predicates with Semijoin Transformations을 참고하십시오.
<temporary table>이는 intermediate 결과를 캐시하기 위해 생성된 내부 temporary 테이블을 나타냅니다.
일부 테이블이 const 또는 system type인 경우, 이들 테이블의 컬럼을 포함하는 표현식은 optimizer에 의해 일찍 평가되고, 표시된 statement의 일부가 아닙니다. 그러나 FORMAT=JSON에서는 일부 const 테이블 액세스가 const 값을 사용하는 ref 액세스로 표시됩니다.
10.8.2 EXPLAIN Output Format
10.8.4 Obtaining Execution Plan Information for a Named Connection