explain は、mysql が indexes を使用して select ステートメントを処理し、テーブルを結合する方法を示します。これは、より適切なインデックスを選択し、より最適化された query ステートメントを作成するのに役立ちます。
使用するには、select ステートメントの前に Explain を追加するだけです:
例:
explain select surname,first_name form a,b where a.id=b.id
EXPLAIN 列の説明:
table: このデータ行がどのテーブルに関するものかを表示します
type: これは重要な列ですこれは、使用される接続の種類を示します。最良から最悪の結合タイプは、const、eq_reg、ref、range、indexhe、および ALL
possible_keys: このテーブルに適用される可能性のあるインデックスを表示します。空の場合、インデックスは作成できません。関連するドメインの WHERE ステートメントから適切なステートメントを選択できます
key: 実際に使用されるインデックス。 NULL の場合、インデックスは使用されません。まれに、MYSQL が最適化が不十分なインデックスを選択することがあります。この場合、SELECT ステートメントで USE INDEX (indexname) を使用してインデックスの使用を強制するか、IGNORE INDEX (indexname) を使用して MYSQL にインデックスを無視させることができます
key_len: 使用されるインデックスの長さ。精度を損なうことなく、短いほど良い
ref: インデックスのどの列が使用されているかを示します (可能であれば定数)
rows: 要求されたデータを返すために MYSQL が考慮する行をチェックする必要がある 数値
Extra: 追加情報MYSQL がクエリを解析する方法について。表 4.3 で説明しますが、ここで見られる悪い例は一時的な使用とファイルソートの使用です。つまり、MYSQL はインデックスをまったく使用できず、その結果、取得が非常に遅くなります
追加の列によって返される説明
Distinct : MYSQL は、行結合に一致する行を見つけると、それ以上検索しません
存在しません: MYSQL は、LEFT JOIN 基準に一致する行を見つけると、LEFT JOIN を最適化します。もう検索は行われません
各 Record(インデックス マップ:#) の範囲チェック: 理想的なインデックスが見つからなかったため、前のテーブルの行の組み合わせごとに、MYSQL はどのインデックスが使用されているかをチェックし、それを使用して行を返しますテーブルから。これは、インデックスを使用した接続の中で最も遅い接続の 1 つです
ファイルソートの使用: これが表示された場合は、クエリを最適化する必要があります。 MYSQL では、返された行をソートする方法を見つけるために追加の手順が必要です。接続タイプと、ソートキー値を格納する行ポインター、および条件に一致するすべての行に基づいてすべての行を並べ替えます。 インデックスの使用: 実際のアクションを読み取らずに、インデックス内の情報のみを使用するテーブルから列データが返されます。これは、テーブルの要求されたすべての列が同じインデックスの一部である場合に発生します
一時的な使用 これが表示された場合は、クエリを最適化する必要があります。ここで、MYSQL は結果を保存するための一時テーブルを作成する必要があります。これは通常、GROUP BY ではなく別の列セットで ORDER BY を実行するときに発生します
WHERE 句を使用して、次のテーブルに一致する行、または返される行を制限します。ユーザー。これは、テーブル内のすべての行を返したくなく、接続タイプが ALL またはインデックスである場合、またはクエリに問題がある場合に発生します。さまざまな接続タイプの説明 (効率の順に並べ替え)
システム。テーブルにはシステム テーブルという 1 つの行しかありません。これは const 結合タイプの特殊なケースです
const: このクエリに一致するテーブル内のレコードの最大値 (インデックスは主キーまたは一意のインデックスにすることができます)。行が 1 つしかないため、この値は実際には定数です。MYSQL はこの値を最初に読み取り、次に定数として扱うからです
eq_ref: 接続では、MYSQL が前のテーブルからクエリを実行すると、各レコードが Read から結合されます。クエリがすべてのインデックスを主キーまたは一意キーとして使用する場合に使用されるテーブルのレコード
ref: この結合タイプは、クエリが一意または主キーではないキー、またはその一部ではないキーを使用する場合にのみ使用されます。これらのタイプ (たとえば、左端のプレフィックスが発生した場合に発生) を使用します。前のテーブルの行結合ごとに、すべてのレコードがテーブルから読み取られます。このタイプは、インデックスに基づいて一致するレコードの数に大きく依存します。少ないほど良いです。
range: この結合タイプは、> または < を使用して何かを検索する場合と同様に、インデックスを使用して行の範囲を返します。
index: this 結合タイプは前のテーブルの各レコード結合に対してフル スキャンを実行します (インデックスは通常テーブル データより小さいため、ALL よりも優れています)
ALL: この結合タイプは前の各レコードに対してフル スキャンを実行します一般に最悪の結合は、できるだけ避けるべきです
以上がMySQL での EXPLAIN コマンドの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。