[MySQL]実行計画1(EXPLAIN)


計画分析の実行
MySQLでは、クエリーの前にEXPAINのキーワードを追加すると、クエリーをどのように実行するかに関する情報が出力されます.実行計画に表示される各コラムの意味は、複数の情報を伝え、その情報を説明する能力が必要である.
1.ID欄
実行計画では、左端のid欄は단위SELECTクエリで与えられた識別子値である.
以下のクエリは外部SELECTと内部SELECTに分けられ,単位SELECTごとに異なるid値が与えられる.(実行計画は、クエリの外部(Outer)から始まり、クエリの内部(Inner)順にテーブルに表示されることに注意してください.)
SELECT ...
FROM (SELECT ... FROM tb_test1) tb1, tb_test2 tb2
WHERE tb1.id=tb2.id;
2.SELECT TYPEコラム
各ユニットSELECTクエリーがどのタイプのクエリーであるかを示すコラム.select typeコラムには、次の値が表示されます.
1. SIMPLE
UNIONまたはサブクエリを使用しない簡単なSELECTクエリ.クエリーがどんなに複雑でも、SIMPLEのクエリーはselect typeが1つしかありません.(通常は一番外側のクエリ)
2. PRIMARY
UNIONまたはサブクエリを持つSELECTクエリの実行計画では、一番外側のクエリがPRIMARYとして表示されます.PRIMARYクエリも1つしか存在しません.
3. UNION
ユニオンにマージされた単位SELECTクエリのうち、1番目以外の2番目の場合、単位SELECTクエリのselect typeがユニオンとして表示されます.UNIONの最初の単位SELECT typeは、UNIONではなくクエリーを収集して保存するための一時テーブル(DERIVED)として表示されます.
EXPLAIN SELECT * FROM (				 //PRIMARY
	(SELECT id FROM employees e1) UNION ALL	 //DERIVED
    (SELECT id FROM employees e2) UNION ALL	 //UNION
    (SELECT id FROM employees e3) ) tb;		 //UNION
4. DEPENDENT UNION
DEPENDENT UNIONは、UNIONを使用してコレクションをマージするクエリにも表示されます.ここで、DEPENDENTは、内部クエリが外部値を参照して処理するときに表示されます.次に、条件e2.id=e1.idおよびe3.id=e1.idが自動的に追加される.
EXPLAIN 
SELECT * 							//PRIMARY
FROM employees e1 WHERE e1.id IN (
	SELECT e2.id FROM employees e2 WHERE e2.name='MATT'	//DEPENDENT SUBQUERY
	UNION
	SELECT e3.id FROM employees e3 WHERE e3.name='MATT'     //DEPENDENT UNION
);
5. UNION RESULT
UNIX結果を含むテーブルを表します.UNIOnRESULTは実際のクエリの単位クエリではないため、id値は個別に付与されません.
EXPLAIN
SELECT id FROM salaries WHERE salary > 100000		//PRIMARY
UNION DISTINCT
SELECT id FROM dept_emp WHERE from_date > '2001-01-01';	//UNION
// id = NULL, select_type = UNION RESULT 인 ROW 추가됨.
6. SUBQUERY
SUBQUERYとは、サブクエリがFROMセクション以外で使用される場合を指す.(FROM節->DERIVED)
7. DEPENDENT SUBQUERY
サブクエリが「外部」(Outer)SELECTクエリで定義されたコラムを使用する場合は、DEPENDENT SUBQUERYとして表示されます.外部クエリーは、最初に実行され、その後内部クエリーが実行されるため、通常のサブクエリーよりも処理速度が遅いことが多い.
8. DERIVED
通常、FROMセクションではサブクエリーが使用されますが、オプティカル(光学式)ドライブのオプションによっては、FROMセクションのサブクエリーは外部クエリーと統合された形式で最適化できます.DERIVEDは、単位SELECTクエリを実行した結果です.これは、メモリまたはディスクにテンポラリ・テーブルを作成することを意味します.
MySQL8.0からFROMセクションのサブクエリを最適化し,不要なサブクエリを結合書き換えクエリで処理する.以前のバージョンの場合は、サブクエリを結合として使用することを強くお勧めします.
(ファイバマネージャは、サブクエリよりも結合を最適化します.)
9. DEPENDENT DERIVED
MySQL8.0から、FROMセクションのサブクエリで外部バーを使用できます.これはDEPENDERIVEDとして表されます.
10. UNCACHEABLE SUBQUERY
同じ条件のサブクエリが実行されると、再実行するのではなく、以前の実行結果が使用可能になるように内部キャッシュ領域に配置されます.ただし、キャッシュが使用できない場合があります.
- 사용자 변수가 서브쿼리에 사용된 경우
- NOT-DETERMINISTIC 속성의 스토어드 루틴이 서브쿼리 내에 사용된 경우
- UUID()나 RAND()와 같이 결과값이 호출때마다 달라지는 함수가 포함된 경우 
11. UNCACHEABLE UNION
UNIONとUNCACHEABLE属性の組み合わせのselect type.
12.MATERIALLIZED(具体化)
MySQL5.バージョン6から導入されたselect typeは、主にFROMセクションまたはIN(subquery)形式のクエリーで使用されるサブクエリーを最適化するために使用されます.
EXPLAIN
SELECT * 
FROM employees e
WHERE id IN (SELECT id FROM salaries WHERE salary BETWEEN 100 AND 1000);
上のクエリでは、MySQL 5です.6より前に、各従業員レコードはサブクエリを実行します.
MySQL5.7から、サブクエリの内容をテンポラリ・テーブルに具体化し、チェックイン形式で最適化します.
3.TABLEコラム
EXPLAIN
SELECT NOW();    //NULL
上記の例で示したように、テーブルを単独で使用しない場合、テーブルバーはNULLとして表示されます.
表欄の<derived N>に示すように、<>に囲まれている場合、この表は一時表を表す.
なお、上記の場合、Nに対応する値は、派生テーブルを作成する実行プランのID番号を示す.
SELECT *
FROM (SELECT de.id FROM dept_emp de GROUP BY de.id) tb, 
	employees e
WHERE e.id = tb.id
上記の例では、FROMセクションのサブクエリは、DERIVEDタイプのテンポラリ・テーブルを作成し、OUTERクエリではeおよび<derived 2>テーブルにサインして使用します.
4.PARTIONSコラム
MySQL5.バージョン7の前に、パーティションリストはEXPLAIN PARTITIONコマンドで検証できますが、MySQL 8です.0からEXPLAINコマンドは、パーティションのすべての実行計画を表示できるように変更されました.
SELECT *
FROM employee
WHERE hire_date BETWEEN '1999-11-15' AND '2000-01-15';
上記のクエリーで、employeeテーブルがhire dateを標準パーティションとしていると仮定すると、オプティカル(光学式)ドライブでクエリーのhire dateコラム条件が表示され、クエリーに必要なデータがどのパーティションにあるかがわかります.(Partition Proution)見つかったPartitionをPARTIONSコラムに掲載します.