EXPLAINコマンドの使用方法
このコマンドを使用する非常に簡単な例を次に示します。
データベーススキーマ:
(ユーザーとユーザーのテーブル)
(アドレス付きのテーブル)
この例では、識別子(userid)に基づいてユーザーデータを選択します。
EXPLAINリクエストを実行した結果、次のようになります。
可変 | 価値 |
クエリ内のテーブルの識別子(ID)。 EXPLAINは、クエリ内のテーブルごとに1つのレコードを作成します。 | |
可能な値は、SIMPLE、PRIMARY、UNION、DEPENDENT UNION、SUBSELECT、およびDERIVEDです。 | |
MySQLがデータを読み取るテーブルの名前 | |
MySQLが使用する結合のタイプ。 可能な値は、eq_ref、ref、range、index、またはallです。 | |
MySQLがテーブル内の行を選択するために使用できるインデックスのリスト(インデックスがない場合はNULL)。 | |
MySQLが使用するインデックスの名前(可能なすべてのインデックスをチェックした後)。 | |
バイト単位のキーサイズ。 | |
キーとの比較に使用される列または値。 | |
MySQLがリクエストを処理するためにチェックする必要がある行の数。 | |
リクエストに関する追加情報。 |
この例は非常に簡単です。 主キー(userid)で検索しますが、条件に合ったレコードは1つしかありません(rows変数は1です)。
より高度な例を次に示します。
このリクエストは最初のリクエストよりも高度です。 ユーザーIDに基づいてユーザーとアドレステーブルを結合します。 ユーザーIDフィールドはユーザーテーブルのプライマリキーですが、アドレステーブルのインデックスではありません。 この場合のEXPLAINコマンドの実行結果は次のようになります。
(ユーザーテーブル)
タイプ:const
可能なキー:プライマリ
参照:const
(テーブルアドレス)
タイプ:すべて
可能なキー:(なし)
参照:(なし)
最初のテーブルが最適化されます。 主キーは、リクエストの実行に使用されます。 2番目のテーブルは最適化されていません。 typeパラメーターの値はすべてで、Posible_keysは空です。つまり、全表スキャンが実行されます。 2番目のテーブルのユーザーフィールドにインデックスを追加すると、最適化されます。
2番目のテーブルを最適化した後のEXPLAINコマンドの出力は次のとおりです。
(ユーザーテーブル)
タイプ:const
可能なキー:プライマリ
参照:const
(テーブルアドレス)
タイプ:const
可能なキー:プライマリ
参照:const
EXPLAINコマンドの詳細については、MySQLの公式ドキュメント( dev.mysql.com/doc/refman/5.0/en/explain.html)を参照してください。