web-dev-qa-db-ja.com

MySQLを理解する '説明'

explainで次のクエリがあります。

mysql> explain 
     select dd.data from dane dd 
       join test1.tag1 t1 on dd.id = t1.id 
       join test1.tag2 t2 on dd.id = t2.id 
       join test1.tag3 t3 on dd.id = t3.id 
       join test1.tag4 t4 on dd.id = t4.id 
       join test1.tag5 t5 on dd.id = t5.id 
       join test1.tag6 t6 on dd.id = t6.id 
       join test1.tag7 t7 on dd.id = t7.id 
       join test1.tag8 t8 on dd.id = t8.id 
       join test1.tag9 t9 on dd.id = t9.id 
       join test1.tag10 t10 on dd.id = t10.id 
     where t1.val = 1 
       and t2.val = 2 
       and t3.val = 3 
       and t4.val = 4 
       and t5.val = 5 
       and t6.val = 6 
       and t7.val = 7 
       and t8.val = 8 
       and t9.val = 9 
       and t10.val = 10 ;
+--+-----------+-----+------+-------------+-------+-------+------------------+-----+------------------------+
|id|select_type|table|type  |possible_keys|key    |key_len|ref               |rows |Extra                   |
+--+-----------+-----+------+-------------+-------+-------+------------------+-----+------------------------+
| 1|SIMPLE     |t10  |index |PRIMARY      |PRIMARY|8      |NULL              |94577|Using where; Using index|
| 1|SIMPLE     |dd   |eq_ref|PRIMARY      |PRIMARY|4      |test1.t10.id      |    1|                        |
| 1|SIMPLE     |t8   |eq_ref|PRIMARY      |PRIMARY|8      |test1.t10.id,const|    1|Using index             |
| 1|SIMPLE     |t1   |eq_ref|PRIMARY      |PRIMARY|8      |test1.t8.id,const |    1|Using where; Using index|
| 1|SIMPLE     |t2   |eq_ref|PRIMARY      |PRIMARY|8      |test1.t1.id,const |    1|Using where; Using index|
| 1|SIMPLE     |t6   |eq_ref|PRIMARY      |PRIMARY|8      |test1.dd.id,const |    1|Using where; Using index|
| 1|SIMPLE     |t4   |eq_ref|PRIMARY      |PRIMARY|8      |test1.t8.id,const |    1|Using where; Using index|
| 1|SIMPLE     |t3   |eq_ref|PRIMARY      |PRIMARY|8      |test1.dd.id,const |    1|Using where; Using index|
| 1|SIMPLE     |t7   |eq_ref|PRIMARY      |PRIMARY|8      |test1.dd.id,const |    1|Using where; Using index|
| 1|SIMPLE     |t9   |eq_ref|PRIMARY      |PRIMARY|8      |test1.t10.id,const|    1|Using index             |
| 1|SIMPLE     |t5   |eq_ref|PRIMARY      |PRIMARY|8      |test1.dd.id,const |    1|Using where; Using index|
+--+-----------+-----+------+-------------+-------+-------+------------------+-----+------------------------+
11 rows in set (0.08 sec)

すべてのtag1-tag10テーブルのビルドは同じです。2つの列(idval)、idが主キーであり、他のインデックスはありません。

説明の最初の行について質問があります。

  1. 行数-この数はスキャンされた行の正確な数ですか、それとも単なる見積もりですか?すべてのテーブルには100,000行があります。
  2. 最初の行のタイプはindexですが、ExtraUsing where; Using indexを示しています。 whereで最初の全表スキャンが使用され、次にindexが使用されるという意味ですか? Whereは、インデックスのないval列にあります。
1
Michał Herman

type: indexは、インデックススキャンであることを意味します。つまり、そのテーブルの全体インデックスをスキャンします。

インデックススキャンは、多くの場合Using indexと一緒に行われます。後者は、クエリがテーブルの行に触れることなく、インデックスを使用してクエリを満たすことができることを示しているためです。 Using indexはより明確にUsing only indexとラベル付けされます。

インデックスにはテーブルの行と同じ数のエントリがあるため、インデックススキャンによって報告されるrowsは、テーブルスキャン中に報告される行と同じ数になります。

rowsによって報告される数は、テーブルに関して収集されたInnoDBの統計に基づく推定値です。 10%以上不正確になる可能性があります。これが正確な数であることに依存しないでください。ただし、実際の行数(またはインデックスエントリ)として、大きさの順にインジケータとして扱います。

tagsテーブルにセカンダリインデックスがない場合がありますが、暗黙的にインデックスを持つプライマリキーがあります。 type: eq_refは、クエリが主キーを使用して結合中にそれぞれの行を検索していることを示します。主キーによるルックアップは良好です。

EXPLAIN出力の詳細については、以下を参照してください。 http://dev.mysql.com/doc/refman/5.6/en/explain-output.html

5
Bill Karwin