MySQL の EXPLAIN 解釈コマンドの紹介 (例付き)

不言
リリース: 2019-04-02 16:15:09
転載
2253 人が閲覧しました

この記事では、MySQL の EXPLAIN 解釈コマンドの紹介 (例を示します) を紹介します。これには一定の参考値があります。必要な友人は参照してください。お役に立てば幸いです。

1 EXPLAIN の概念

EXPLAIN は、SQL を実行する MySQL に関する情報を提供します。

  1. EXPLAIN は、SELECT、DELETE、INSERT、REPLACE、UPDATE について説明できます。その他のステートメント。
  2. EXPLAIN が解釈可能なステートメントとともに使用されると、mysql はオプティマイザーからの SQL 実行プランに関する情報を表示します。つまり、MySQL はこれらのステートメントをどのように処理し、テーブルがどのように接続されるかを説明します。 EXPLAIN が実行計画を取得する方法について詳しく知りたい。
  3. EXPLAIN の後に実行可能ステートメントの代わりにセッション connection_id が続く場合、セッション情報が表示されます。
  4. SELECT ステートメントの場合、EXPLAIN は追加の実行プラン情報を生成します。これらの情報は、SHOW WARNINGS を使用して表示できます。
  5. EXPLAIN は、パーティション テーブルを設計するクエリをチェックするのに役立ちます。
  6. FORMAT オプションを使用して出力形式を選択できます。FORMAT オプションが設定されていない場合は、デフォルトで表形式で出力されます。 JSON オプションを使用すると、情報を json 形式で表示できます。

2 EXPLAIN 出力列情報

EXPLAIN 出力フィールド情報
最初の列: 列名、2 列目: FORMAT = JSON 名の場合に出力に表示される同等の属性、3 列目: フィールドの意味

列##意味select_id識別番号を選択タイプを選択#tabletable_nameこのデータ行はどのテーブルを参照しますかパーティション partitionsパーティションに一致します。パーティション化されていないテーブルの場合、この値は空ですpossible_keyspossible_keyskey key_lenrefrows##filteredfiltered# の実行時に検証する必要がある行の数を考慮します。 ##追加なし追加情報#2.1 idSELECT 識別子。 SELECT クエリ内のシーケンス番号。空にすることもできます。 2.2 select_typeSELECT タイプ。すべてのタイプを次の表に示します。JSON 形式の EXPLAIN は、SIMPLE または PRIMARY でない限り、SELECT タイプを query_block の属性として公開します。 JSON 名 (該当する場合はなし) も表に表示されます。 select_type 値
##JSON 名 ##id
select_type なし
##type access_type 使用される接続タイプ、使用するかどうかインデックス
#MySQL がこのテーブル内の行を検索するために使用できるインデックス
key MySQL が実際に使用することを決定するキー (インデックス)
key_length MySQL は使用するキーの長さを決定します。キーが NULL の場合、長さは NULL になります。
ref インデックスに関連付けられた列
rows mysql は、sql
##このクエリ条件によってフィルターされたデータのパーセンテージを示します
JSON 名

意味

SIMPLENoneNoneクエリをネストする場合の最も外側のクエリUNION 内の 2 番目以降の SELECT ステートメントUNION の 2 番目以降の SELECT ステートメントは、外部クエリに依存します#UNION RESULTunion_resultUNION の結果SUBQUERYNone子クエリの最初の選択DEPENDENT SUBQUERYdependent (true)サブクエリの最初の選択は、外部クエリに依存します DERIVEDNone派生テーブル (サブクエリで生成された一時テーブル)MATERIALIZED materialized_from_subqueryマテリアライズド サブクエリUNCACHEABLE SUBQUERYcacheable (false)結果をキャッシュできませんサブクエリは外部クエリの行ごとに再計算する必要があります#

テーブル情報 (後のデモ用):

mysql> show create table t_a;
------+
| t_a   | CREATE TABLE `t_a` (
  `id` bigint(20) NOT NULL DEFAULT '0',
  `age` int(20) DEFAULT NULL,
  `code` int(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_code` (`code`),
  KEY `age_key` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+-----------------------------------
------+
1 row in set (0.03 sec)
ログイン後にコピー

SIMPLE: 単純な SELECT (UNION やサブクエリなどを使用しない)

mysql> explain select * from t_a where id =1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t_a   | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.03 sec)
ログイン後にコピー

PRIMARY: クエリをネストする場合の最も外側のクエリ

mysql> explain select * from t_a where num >(select num from t_a where id = 3);
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
|  1 | PRIMARY     | t_a   | NULL       | range | num_key       | num_key | 5       | NULL  |    6 |   100.00 | Using where; Using index |
|  2 | SUBQUERY    | t_a   | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL                     |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
2 rows in set, 1 warning (0.03 sec)
ログイン後にコピー
ログイン後にコピー

UNION: UNION の 2 番目以降の SELECT ステートメント

mysql> explain select * from t_a where id =9 union all select * from t_a;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | PRIMARY     | t_a   | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL        |
|  2 | UNION       | t_a   | NULL       | index | NULL          | num_key | 5       | NULL  |    9 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
2 rows in set, 1 warning (0.04 sec)
ログイン後にコピー

DEPENDENT UNION: 外部 QUERY

mysql> explain select * from t_a where id in (select id from t_a where id >8 union all select id from t_a where id =5);
+----+--------------------+-------+------------+--------+---------------+---------+---------+-------+------+----------+--------------------------+
| id | select_type        | table | partitions | type   | possible_keys | key     | key_len | ref   | rows | filtered | Extra                    |
+----+--------------------+-------+------------+--------+---------------+---------+---------+-------+------+----------+--------------------------+
|  1 | PRIMARY            | t_a   | NULL       | index  | NULL          | num_key | 5       | NULL  |    9 |   100.00 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | t_a   | NULL       | eq_ref | PRIMARY       | PRIMARY | 8       | func  |    1 |   100.00 | Using where; Using index |
|  3 | DEPENDENT UNION    | t_a   | NULL       | const  | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | Using index              |
+----+--------------------+-------+------------+--------+---------------+---------+---------+-------+------+----------+--------------------------+
3 rows in set, 1 warning (0.08 sec)
ログイン後にコピー
に応じて、UNION の 2 番目以降の SELECT ステートメント

UNION RESULT: UNION の結果

mysql> explain select num from t_a where id = 3 union select num from t_a where id =4;
+----+--------------+------------+------------+-------+---------------+---------+---------+-------+------+----------+-----------------+
| id | select_type  | table      | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra           |
+----+--------------+------------+------------+-------+---------------+---------+---------+-------+------+----------+-----------------+
|  1 | PRIMARY      | t_a        | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL            |
|  2 | UNION        | t_a        | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL            |
| NULL | UNION RESULT | <union1,2> | NULL       | ALL   | NULL          | NULL    | NULL    | NULL  | NULL |     NULL | Using temporary |
+----+--------------+------------+------------+-------+---------------+---------+---------+-------+------+----------+-----------------+
3 rows in set, 1 warning (0.03 sec)
ログイン後にコピー

SUBQUERY: サブクエリの最初の選択

mysql> explain select * from t_a where num >(select num from t_a where id = 3);
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
|  1 | PRIMARY     | t_a   | NULL       | range | num_key       | num_key | 5       | NULL  |    6 |   100.00 | Using where; Using index |
|  2 | SUBQUERY    | t_a   | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL                     |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
2 rows in set, 1 warning (0.03 sec)
ログイン後にコピー
ログイン後にコピー

DEPENDENT SUBQUERY: サブクエリの最初の選択 (外部クエリに応じて)

mysql> explain select * from t_a where num in(select num from t_a where id = 3 union select num from t_a where id =4);
+----+--------------------+------------+------------+-------+-----------------+---------+---------+-------+------+----------+--------------------------+
| id | select_type        | table      | partitions | type  | possible_keys   | key     | key_len | ref   | rows | filtered | Extra                    |
+----+--------------------+------------+------------+-------+-----------------+---------+---------+-------+------+----------+--------------------------+
|  1 | PRIMARY            | t_a        | NULL       | index | NULL            | num_key | 5       | NULL  |    9 |   100.00 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | t_a        | NULL       | const | PRIMARY,num_key | PRIMARY | 8       | const |    1 |   100.00 | NULL                     |
|  3 | DEPENDENT UNION    | t_a        | NULL       | const | PRIMARY,num_key | PRIMARY | 8       | const |    1 |   100.00 | NULL                     |
| NULL | UNION RESULT       | <union2,3> | NULL       | ALL   | NULL            | NULL    | NULL    | NULL  | NULL |     NULL | Using temporary          |
+----+--------------------+------------+------------+-------+-----------------+---------+---------+-------+------+----------+--------------------------+
4 rows in set, 1 warning (0.12 sec)
ログイン後にコピー

DERIVED: 派生テーブル (サブクエリで生成された一時テーブル)

mysql> explain select a.id from (select id from t_a where id >8 union all select id from t_a where id =5) a;
+----+-------------+------------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
| id | select_type | table      | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra                    |
+----+-------------+------------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL   | NULL          | NULL    | NULL    | NULL  |    3 |   100.00 | NULL                     |
|  2 | DERIVED     | t_a        | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL  |    1 |   100.00 | Using where; Using index |
|  3 | UNION       | t_a        | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | Using index              |
+----+-------------+------------+------------+-------+---------------+---------+---------+-------+------+----------+--------------------------+
3 rows in set, 1 warning (0.12 sec)
ログイン後にコピー

2.3 table

このデータ行がどのテーブルを参照しているかを示します。実際のテーブル名である場合もあれば、次のような結果になる場合もあります。

  • : ID を参照します。M 行と N 行の和集合結果です。
  • < ;derivedN>: この行は、ID 値が n の行の派生テーブルの結果を参照します。たとえば、派生テーブルは from 句のサブクエリから取得される場合があります。
  • : この行は、ID 値が n の行の実体化されたサブクエリの結果を参照します。

2.4 パーティション

クエリされたレコードが属するパーティション。パーティション化されていないテーブルの場合、この値は NULL です。

2.5 type

接続に使用されるカテゴリとインデックスが使用されるかどうか。一般的に使用されるタイプは次のとおりです: system、const、eq_ref、ref、range、index、ALL (左から)詳細については、「EXPLAIN 結合タイプ」を参照してください。

NULL: MySQL は最適化プロセス中にステートメントを分解し、実行中にテーブルやインデックスにアクセスする必要さえありません。インデックス列の最小値は、別のインデックスを通じて選択できます。 検索が完了しました。

システム: このテーブル (クエリ対象の一時テーブルである場合もあります) には、データ (= システム テーブル) が 1 行だけあります。これは const

const の特殊なケースです: テーブルには一致する行が 1 つだけあり、クエリの先頭で読み取られます。行が 1 つしかないため、この行の列値はオプティマイザーの残りの部分によって定数として扱われます。 const テーブルは一度だけ読み取られるため高速です。 const は、条件が PRIMARY KEY または UNIQUE インデックスであり、定数値と比較される場合、クエリのすべての部分に使用されます。
次のクエリでは、tbl_name を const テーブルに使用できます。

SELECT * from tbl_name WHERE primary_key=1;
SELECT * from tbl_name WHERE primary_key_part1=1和 primary_key_part2=2;

--例子
mysql> explain select * from t_a where id =1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | t_a   | NULL       | const | PRIMARY       | PRIMARY | 8       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.07 sec)
ログイン後にコピー

eq_ref: 前のテーブルの行の組み合わせごとに、このテーブルから 1 行を読み取ります。 system と const に加えて、これが最適な接続タイプです。これは、結合でインデックスのすべての部分が使用され、インデックスが主キーまたは一意の非 null インデックスである場合に使用されます。 eq_ref は、= 演算子を使用して比較したインデックス付き列で使用できます。比較値には、定数、またはこのテーブルの前に読み取られたテーブルの列を使用する式を指定できます。
次の例では、MySQL は eq_ref 結合を使用して ref_table を処理できます:

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;

--例子(t_b为t_a的复制表,表结构相同)
mysql> explain select * from t_a,t_b where t_a.code=t_b.code;
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref           | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------+
|  1 | SIMPLE      | t_a   | NULL       | ALL    | uk_code       | NULL    | NULL    | NULL          |    9 |   100.00 | NULL  |
|  1 | SIMPLE      | t_b   | NULL       | eq_ref | uk_code       | uk_code | 4       | test.t_a.code |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------+
2 rows in set, 1 warning (0.03 sec)
ログイン後にコピー

ref 前のテーブルの行の組み合わせごとに、一致するインデックス値を持つすべての行がこのテーブルから読み取られます。 。結合でキーの左端のプレフィックスのみが使用される場合、またはキーが UNIQUE キーまたは PRIMARY KEY ではない場合 (つまり、キー クエリに基づいて結合の結果が 1 行にならない場合)、ref を使用します。この結合タイプは、少数の行のみに一致するキーを使用している場合に適しています。 ref は、= 演算子または <=> 演算子を使用してインデックス付き列で使用できます。
次の例では、MySQL は ref 結合を使用して ref_table を処理できます:

SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;

--例子(t_b为t_a的复制表,表结构相同)
mysql> explain select * from t_a,t_b where t_a.age=t_b.age;
+----+-------------+-------+------------+------+---------------+---------+---------+--------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key     | key_len | ref          | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+---------+---------+--------------+------+----------+-------------+
|  1 | SIMPLE      | t_a   | NULL       | ALL  | age_key       | NULL    | NULL    | NULL         |    9 |   100.00 | Using where |
|  1 | SIMPLE      | t_b   | NULL       | ref  | age_key       | age_key | 5       | test.t_a.age |    1 |   100.00 | NULL        |
+----+-------------+-------+------------+------+---------------+---------+---------+--------------+------+----------+-------------+
2 rows in set, 1 warning (0.03 sec)
ログイン後にコピー

fulltext: FULLTEXT インデックスを使用して結合を実行します

ref_or_null: 結合タイプ ref は似ていますが、NULL 値を含む行を特別に検索する MySQL 機能が追加されました。この結合タイプの最適化は、サブクエリを解決する際によく使用されます。
次の例では、MySQL は ref_or_null 結合を使用して ref_table を処理できます。

SELECT * FROM ref_table
  WHERE key_column=expr OR key_column IS NULL;

--例子
mysql> explain select * from t_a where t_a.age =3 or t_a.age is null;
+----+-------------+-------+------------+-------------+---------------+---------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type        | possible_keys | key     | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------------+---------------+---------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | t_a   | NULL       | ref_or_null | age_key       | age_key | 5       | const |    2 |   100.00 | Using index condition |
+----+-------------+-------+------------+-------------+---------------+---------+---------+-------+------+----------+-----------------------+
1 row in set, 1 warning (0.03 sec)
ログイン後にコピー

index_merge: この結合タイプは、インデックス マージ最適化メソッドが使用されることを示します。この場合、key 列には使用されるインデックスのリストが含まれ、key_len には使用されるインデックスの最長のキー要素が含まれます。

SELECT * FROM ref_table
  WHERE idx1=expr1 OR idx2 =expr2;

--例子
mysql> explain select * from t_a where t_a.code =3 or t_a.age = 3;
+----+-------------+-------+------------+-------------+-----------------+-----------------+---------+------+------+----------+-------------------------------------------+
| id | select_type | table | partitions | type        | possible_keys   | key             | key_len | ref  | rows | filtered | Extra                                     |
+----+-------------+-------+------------+-------------+-----------------+-----------------+---------+------+------+----------+-------------------------------------------+
|  1 | SIMPLE      | t_a   | NULL       | index_merge | uk_code,age_key | uk_code,age_key | 4,5     | NULL |    2 |   100.00 | Using union(uk_code,age_key); Using where |
+----+-------------+-------+------------+-------------+-----------------+-----------------+---------+------+------+----------+-------------------------------------------+
1 row in set, 1 warning (0.03 sec)
ログイン後にコピー

unique_subquery: この型は、次の形式の IN サブクエリの ref を置き換えます:

value IN (SELECT Primary_key FROM single_table WHERE some_expr)
unique_subquery は次の形式です。 a インデックス検索関数はサブクエリを完全に置き換えることができ、より効率的です。

index_subquery: この結合タイプは unique_subquery に似ています。 IN サブクエリは置換できますが、次の形式のサブクエリの一意でないインデックスに限ります:

value IN (SELECT key_column FROM single_table WHERE some_expr)

range: 指定された値のみを取得しますインデックスを使用して行を選択する、行の範囲。キー列には、どのインデックスが使用されたかが表示されます。 key_len には、使用されるインデックスの最長のキー要素が含まれます。この型では ref 列は NULL です。 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN または IN 演算子を使用する場合、キー列を定数と比較するときに range# を使用できます。 #

mysql> explain select * from t_a where id > 8;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t_a   | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.03 sec)
ログイン後にコピー
index: この結合タイプは、インデックス ツリーのみがスキャンされることを除いて、ALL と同じです。通常、インデックス ファイルはデータ ファイルよりも小さいため、これは通常 ALL より高速です。 MySQL は、クエリで単一のインデックスの一部であるカラムのみを使用する場合に、この結合タイプを使用できます。


ALL: 前のテーブルの行の組み合わせごとに完全なテーブル スキャンを実行します。これは、テーブルが const とマークされていない最初のテーブルである場合には通常良くありません。その場合は、通常は良くありません。通常、ALL を使用せずにインデックスを追加して、前のテーブルの定数値または列の値に基づいて行を取得できるようにすることができます。

2.6 possible_keys

possible_keys 列は、MySQL がテーブル内の行を検索するために使用できるインデックスを示します。この列は、EXPLAIN 出力に表示されるテーブルの順序とは完全に独立していることに注意してください。これは、 possible_keys 内の一部のキーは、生成されたテーブルの順序では実際には使用できないことを意味します。

列が NULL の場合、関連するインデックスはありません。この場合、WHERE 句をチェックして、インデックス付けに適した特定の列を参照しているかどうかを確認することで、クエリのパフォーマンスを向上させることができます。その場合は、適切なインデックスを作成し、再度 EXPLAIN でクエリ

2.7 key

# を確認してください。key 列には、MySQL が実際に使用することを決定したキー (インデックス) が表示されます。インデックスが選択されていない場合、キーは NULL になります。 MySQL に possible_keys カラムのインデックスの使用または無視を強制するには、クエリで FORCE INDEX、USE INDEX、または IGNORE INDEX を使用します。

2.8 key_len

key_len 列には、MySQL が使用することを決定したキーの長さが表示されます。キーが NULL の場合、長さは NULL になります。
使用されるインデックスの長さ。精度を損なうことなく、長さは短いほど良いです。

2.9 ref

ref 列は、テーブルから行を選択するためにキーとともに使用される列または定数を示します。

2.10 rows

rows 列には、クエリの実行時に MySQL が検査する必要があると考える行数が表示されます。

2.11 Extra

この列には、以下で詳しく説明するように、MySQL がクエリをどのように解決したかの詳細が含まれています。

  1. 区別: MYSQL が行に一致する行を見つけたらユニオン、もう検索しません
  2. 存在しません: MYSQL は LEFT JOIN を最適化します。LEFT JOIN 条件に一致する行が見つかると、検索しなくなります
  3. それぞれについて範囲がチェックされます: 理想的なインデックスが見つかりません。したがって、前のテーブルの行の組み合わせごとに、MYSQL はどのインデックスが使用されたかをチェックし、それを使用してテーブルから行を返します。これは、インデックスを使用した接続の中で最も遅い接続の 1 つです。
  4. ファイルソートの使用: これが表示された場合は、クエリを最適化する必要があります。 MYSQL では、返された行をソートする方法を見つけるために追加の手順が必要です。接続タイプと、ソートキー値を格納する行ポインター、および条件に一致するすべての行に基づいてすべての行をソートします。
  5. インデックスの使用: 実際のデータを読み取ることなく、インデックス内の情報のみを使用して列データが取得されます。アクション テーブルが返されます。これは、テーブルの要求されたすべての列が同じインデックスの一部である場合に発生します。
  6. 一時的な使用: これが表示された場合、クエリを最適化する必要があります。ここで、MYSQL は結果を保存するための一時テーブルを作成する必要があります。これは通常、GROUP BY ではなく、ORDER BY が別の列セットに対して実行されるときに発生します。
  7. WHERE の使用: WHERE 句は、どの行を保存するかを制限するために使用されます。次のテーブルと比較されるか、テーブルが照合されるか、ユーザーに返されます。テーブル内のすべての行を返したくない場合で、接続タイプが ALL またはインデックスの場合、これが発生するか、クエリに問題があります。

[関連する推奨事項:MySQL ビデオ チュートリアル #]

単純な SELECT (UNION やサブクエリなどを使用しない) PRIMARY
UNION なし
DEPENDENT UNION #dependent (true)
#UNCACHEABLE UNION cacheable (false) UNION の UNCACHEABLE サブクエリ 2 番目以降の選択 (「UNCACHEABLE SUBQUERY」を参照してください)

以上がMySQL の EXPLAIN 解釈コマンドの紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート