MySQL explinは、クエリ命令情報の原理と例を取得する。


explanはクエリー実行計画情報を取得するために使用されます。
一、文法
selectの前にexplinを加えるだけでいいです。

mysql> explain select 1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra     |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| 1 | SIMPLE   | NULL | NULL    | NULL | NULL     | NULL | NULL  | NULL | NULL |   NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
二、explanにおける情報
1、id:SELECTの所属する行を表します。idが大きいほど、実行順序が高くなり、id相が同時に上から下まで実行されます。
2、select_type:対応行を表示するのは簡単ですか?それとも複雑ですか?
1)SIM PLE:簡単な照会は、サブクエリとユニオンが含まれていないことを意味します。
2)SUBQUERY:サブクエリを表します。
3)DERIVED:FORM子文のサブクエリに含まれるSELECTを表します。
4)ユニオン:
3、テーブル:どのテーブルにアクセスするかを示す。
4、partitions:アクセスパーティション
5、type:関連タイプは、表の行をどうやって検索しますか?
1)ALL:全表スキャン。データを検索するためには、すべてのデータを最初から最後までスキャンしなければなりません(limitキーワードはすべてのデータをスキャンしません)。
2)index:索引スキャン。これは全表スキャンと同じで、行ではなく索引順でスキャンするだけで、主な利点は順序付けを回避することであり、最大の欠点はインデックス順にテーブル全体のオーバーヘッドを読み取ることである。
3)レンゲ:範囲スキャン。つまり、インデックスをスキャンする制限があります。インデックスのある点から始まります。すべての索引を参照してください。
4)ref:インデックスアクセス。これは単一の値にマッチするすべての行を返します。非一意性のすべてまたは一意性のすべての非固有プレフィックスを使用する場合にのみ発生します。
5)eq_ref:このインデックスを使って検索すると、最大1つのレコードが返されます。プライマリキーインデックスと一意インデックスがあれば。
6)const、system:MySQLがクエリの一部を最適化し、定数に変換することができる場合、これらのアクセスタイプを使用します。
6、possible_keys:お問い合わせはどのようなものが使えますか?
7、key:MySQLはどのインデックスを採用してこのテーブルのアクセスを最適化するかを決定しました。もしこのインデックスがpossibleに現れなかったら、keysでは、カバーインデックスが選択されているかもしれません。インデックスが使用されていない場合、この値はNULLです。
8、key_len:インデックスのバイト数は、短いほど良いです。普通はkey_ですlenはインデックス列フィールドのタイプの長さに等しく、intは4バイト、bigintは8バイト、dateは3バイト、datetimeは8バイトです。索引の列が文字列の種類である場合、彼の文字セットを考慮して、utf 8は各文字が3つのフィールドを占め、可変タイプ(varhar)は2バイトを追加する必要がある。索引の列が空である場合は、フィールドを追加します。
9、ref:
10、ローソン:MySQLは、必要な行を見つけるために読み込む行を推定します。
11、filtered:戻り値の行数は読み取り行数のパーセンテージ(推定)を占め、値が大きいほど良いです。
12、Extra:他の列には適合していないが、重要な情報を表示し、よく見る価値はあります。
1)Using index:表にアクセスしないようにカバーインデックスを使用することを示す。
2)Using where:MySQLサーバはエンジン検索行を記憶してからフィルタリングします。
3)Using temporary:MySQLはクエリーの結果を並べ替える時に臨時表を使うという意味です。
三、例
例1:

mysql> explain select * from bd_dept;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE   | bd_dept | NULL    | ALL | NULL     | NULL | NULL  | NULL |  3 |  100.00 | NULL |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
この文は全表スキャンされていて、索引が使用されていないことが分かります。
例2:

mysql> explain select * from bd_dept where id=1;
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key   | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE   | bd_dept | NULL    | const | PRIMARY    | PRIMARY | 4    | const |  1 |  100.00 | NULL |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
この文はキーインデックスを使用していますが、1つのレコードをスキャンするだけで結果が得られます。intタイプは4バイトですので、ken_len=4です。
例3:

mysql> explain select * from bd_dept where dept_code='01';
+----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key    | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+
| 1 | SIMPLE   | bd_dept | NULL    | const | dept_code   | dept_code | 32   | const |  1 |  100.00 | NULL |
+----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+
dept_コードは一意のインデックスフィールドであり、フィールドタイプはvarhar(10)であり、空ではないので、インデックス長は10*3+2=33である。
例4:

mysql> explain select * from bd_dept where create_date>'2020-04-29';
+----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
| id | select_type | table  | partitions | type | possible_keys | key     | key_len | ref | rows | filtered | Extra         |
+----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE   | bd_dept | NULL    | range | create_date  | create_date | 4    | NULL |  1 |  100.00 | Using index condition |
+----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
クリアードdateはdateタイプで、通常の索引フィールドは空であり、クエリー条件が大きいため、関連するタイプはrangeで、インデックス長は3+1=4です。
例5:

mysql> explain select a.id, a.dept_name, b.dept_name parent_name from bd_dept a inner join bd_dept b on a.id=b.parent_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key   | key_len | ref         | rows | filtered | Extra    |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+
| 1 | SIMPLE   | b   | NULL    | ALL  | NULL     | NULL  | NULL  | NULL         |  3 |  100.00 | Using where |
| 1 | SIMPLE   | a   | NULL    | eq_ref | PRIMARY    | PRIMARY | 4    | zhi_test.b.parent_id |  1 |  100.00 | NULL    |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+
MySQLはまず全表スキャンを実行して、メインキーによって関連付けられていることが分かります。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。