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つの列(id
、val
)、id
が主キーであり、他のインデックスはありません。
説明の最初の行について質問があります。
index
ですが、Extra
はUsing where; Using index
を示しています。 where
で最初の全表スキャンが使用され、次にindex
が使用されるという意味ですか? Where
は、インデックスのないval
列にあります。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