EXPLAINでsql実行状況を分析する
EXPLAINの使い方
[外部チェーン画像の転送に失敗しました.ソース局には盗難防止チェーンがある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-n 4 WOJe 0 W-1577251291919)(/images/explain.png)] id:選択フラグ select_type:クエリーのタイプを表します. table:結果セットを出力テーブル partitions:一致するパーティション type:テーブルの接続タイプを示す possible_keys:クエリーで使用可能なインデックス を表します. key:実際に使用するインデックスを示す key_len:インデックスフィールドの長さ ref:カラムとインデックスの比較 rows:スキャンされた行数(推定された行数) filtered:表条件でフィルタされた行の割合 Extra:実行状況の説明と説明 select_type
二、select_type
クエリー内の各select句のタイプ
(1)SIMPLECT(単純SELECT、UNIONやサブクエリ等を使用しない)
(2)PRIMARY(サブクエリの最外層クエリ、クエリに複雑なサブ部分が含まれている場合、最外層のselectはPRIMARYと表記される)
(3)ユニオン(ユニオンの2番目または後のSELECT文)
(4)DEPENDENT UNION(UNIONの2番目または後のSELECT文は、外のクエリに依存)
(5)UNION RESULT(UNIONの結果、union文の2番目のselect開始後のすべてのselect)
(6)SUBQUERY(サブクエリの最初のSELECT、結果は外部クエリに依存しない)
(7)DEPENDENT SUBQUERY(サブクエリの最初のSELECT、外部クエリ依存)
(8)DERIVED(派生テーブルのSELECT,FROM句のサブクエリ)
(9)UNCACHEABLE SUBQUERY(サブクエリの結果はキャッシュできません.外部リンクの最初の行を再評価する必要があります)
三、type
テーブルへのアクセス方法は、MySQLがテーブルに必要なローを見つける方法であり、「アクセスタイプ」とも呼ばれます.
よく使われるタイプは、ALL、index、range、ref、eq_ref、const、system、NULL(左から右へ、性能が悪いから良い)
ALL:Full Table Scan、MySQLは、一致するローを見つけるためにテーブル全体を巡回します.
index:Full Index Scan,indexとALLはindexタイプがインデックスツリーのみを巡回すると区別される.select camera_id from camera.
range:指定した範囲のローのみを取得し、インデックスを使用してローを選択します.
ref:インデックス・カラムの値を検索するために使用されるカラムまたは定数を表すテーブルの接続一致条件です.プライマリ・キー以外のインデックスでクエリーを行う場合はref
eq_ref:refと同様に、使用するインデックスが一意のインデックスであることを区別します.インデックスキー値ごとに、テーブルにはレコードマッチングが1つしかありません.簡単に言えば、マルチテーブル接続でprimary keyまたはunique keyを関連条件として使用します.
const、system:MySQLがクエリの一部を最適化し、定数に変換する場合に使用します.プライマリ・キーをwhereリストに配置すると、MySQLはクエリーを定数に変換できます.systemはconstタイプの特例で、クエリーのテーブルが1行しかない場合はsystemを使用します.プライマリ・キーで検索する場合はconst
NULL:MySQLは、最適化中に文を分解し、実行時にテーブルやインデックスにアクセスする必要もありません.たとえば、インデックス列から最小値を選択すると、個別のインデックス検索で完了します.
四、rows
結果セットの行数を推定します.MySQLは、テーブル統計およびインデックスの選択状況に基づいて、必要なレコードを見つけるために読み取る必要がある行数を推定します.ここでは、最終結果ではなく、必要なレコードを見つけるために読み取る必要がある行数を指します.
五、Extra
using where:whereを使ってフィルタリングしたことを示しています.他の意味があるとは思わないでください.ネット上では多くの説に問題があります.
using index:上書きインデックスが使用されていることを示します.すなわち、クエリーの内容はインデックスから直接取得できます.
Using filesort:mysqlがデータに外部インデックスソートを適用することを示します.テーブル内のインデックス順に読み込むのではなく、MySQLでインデックスを使用してソート操作を完了できないことを「ファイルソート」と呼びます.
Using temporary:テンポラリ・テーブルを使用して中間結果を保存し、mysqlはクエリー結果のソート時にテンポラリ・テーブルを使用します.ソートorder byとパケットクエリーgroup byによく見られます.
using join buffer:接続キャッシュを使用
impossible where:where句の値は常にfalseであり、メタグループを取得するために使用できません.
select tables optimized away:group by句がない場合、インデックスに基づいてMin、max操作を最適化したり、MyISAMストレージエンジンに対してcount(*)を最適化したりして、実行段階まで計算する必要がなく、実行計画生成の段階をクエリーして最適化を完了します.
-- SQL, Jefabc
select * from emp where name = 'Jefabc';
-- SQL , explain
explain select * from emp where name = 'Jefabc';
[外部チェーン画像の転送に失敗しました.ソース局には盗難防止チェーンがある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-n 4 WOJe 0 W-1577251291919)(/images/explain.png)]
二、select_type
クエリー内の各select句のタイプ
(1)SIMPLECT(単純SELECT、UNIONやサブクエリ等を使用しない)
(2)PRIMARY(サブクエリの最外層クエリ、クエリに複雑なサブ部分が含まれている場合、最外層のselectはPRIMARYと表記される)
(3)ユニオン(ユニオンの2番目または後のSELECT文)
(4)DEPENDENT UNION(UNIONの2番目または後のSELECT文は、外のクエリに依存)
(5)UNION RESULT(UNIONの結果、union文の2番目のselect開始後のすべてのselect)
(6)SUBQUERY(サブクエリの最初のSELECT、結果は外部クエリに依存しない)
(7)DEPENDENT SUBQUERY(サブクエリの最初のSELECT、外部クエリ依存)
(8)DERIVED(派生テーブルのSELECT,FROM句のサブクエリ)
(9)UNCACHEABLE SUBQUERY(サブクエリの結果はキャッシュできません.外部リンクの最初の行を再評価する必要があります)
三、type
テーブルへのアクセス方法は、MySQLがテーブルに必要なローを見つける方法であり、「アクセスタイプ」とも呼ばれます.
よく使われるタイプは、ALL、index、range、ref、eq_ref、const、system、NULL(左から右へ、性能が悪いから良い)
ALL:Full Table Scan、MySQLは、一致するローを見つけるためにテーブル全体を巡回します.
index:Full Index Scan,indexとALLはindexタイプがインデックスツリーのみを巡回すると区別される.select camera_id from camera.
range:指定した範囲のローのみを取得し、インデックスを使用してローを選択します.
ref:インデックス・カラムの値を検索するために使用されるカラムまたは定数を表すテーブルの接続一致条件です.プライマリ・キー以外のインデックスでクエリーを行う場合はref
eq_ref:refと同様に、使用するインデックスが一意のインデックスであることを区別します.インデックスキー値ごとに、テーブルにはレコードマッチングが1つしかありません.簡単に言えば、マルチテーブル接続でprimary keyまたはunique keyを関連条件として使用します.
const、system:MySQLがクエリの一部を最適化し、定数に変換する場合に使用します.プライマリ・キーをwhereリストに配置すると、MySQLはクエリーを定数に変換できます.systemはconstタイプの特例で、クエリーのテーブルが1行しかない場合はsystemを使用します.プライマリ・キーで検索する場合はconst
NULL:MySQLは、最適化中に文を分解し、実行時にテーブルやインデックスにアクセスする必要もありません.たとえば、インデックス列から最小値を選択すると、個別のインデックス検索で完了します.
四、rows
結果セットの行数を推定します.MySQLは、テーブル統計およびインデックスの選択状況に基づいて、必要なレコードを見つけるために読み取る必要がある行数を推定します.ここでは、最終結果ではなく、必要なレコードを見つけるために読み取る必要がある行数を指します.
五、Extra
using where:whereを使ってフィルタリングしたことを示しています.他の意味があるとは思わないでください.ネット上では多くの説に問題があります.
using index:上書きインデックスが使用されていることを示します.すなわち、クエリーの内容はインデックスから直接取得できます.
Using filesort:mysqlがデータに外部インデックスソートを適用することを示します.テーブル内のインデックス順に読み込むのではなく、MySQLでインデックスを使用してソート操作を完了できないことを「ファイルソート」と呼びます.
Using temporary:テンポラリ・テーブルを使用して中間結果を保存し、mysqlはクエリー結果のソート時にテンポラリ・テーブルを使用します.ソートorder byとパケットクエリーgroup byによく見られます.
using join buffer:接続キャッシュを使用
impossible where:where句の値は常にfalseであり、メタグループを取得するために使用できません.
select tables optimized away:group by句がない場合、インデックスに基づいてMin、max操作を最適化したり、MyISAMストレージエンジンに対してcount(*)を最適化したりして、実行段階まで計算する必要がなく、実行計画生成の段階をクエリーして最適化を完了します.