我对MySQL有几个问题的解释。
All rows with matching index values are read from this table for each combination of rows from the previous tables.
Using where?
Using Index
KEY column : SE
SE上的INDEX
mysql> Create index SE on S(E); Query OK, 0 rows affected (1.15 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> explain SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND R.B=5 AND S.E=5; +----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ | 1 | SIMPLE | S | ref | RID,SE | SE | 5 | const | 6 | Using where | | 1 | SIMPLE | R | eq_ref | PRIMARY | PRIMARY | 4 | project2.S.RID | 1 | Using where | +----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+
数据集
表R具有100,000行和以下字段:
表S具有500,000行和以下字段:
SID(主键):1到500,000之间的整数
询问
SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND R.B=5 AND S.E=5;
此查询也可以像这样重写:
SELECT COUNT(R.RID) FROM R, S WHERE R.RID=S.RID AND R.B=5 AND S.E=5; to SELECT COUNT(R.RID) FROM R INNER JOIN S ON R.RID=S.RID WHERE R.B=5 AND S.E=5;
1.上一张表是什么
上空话http://dev.mysql.com/doc/refman/5.7/en/explain- output.html的ref和eq_ref容易引起混淆。这里有两个表。每个人都将另一个人称为上表(这是我的解释)。这里的联接为inner join,因此数据库将所有R记录与S进行匹配,并且如果RID匹配,则仅考虑那些适合查看的记录。
ref
eq_ref
inner join
当文档同时针对eq_ref和引用相同的示例时,也会引起混淆ref:
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
总的来说,当解释提到ref和eq_ref时,我查看各自的表以查看它们所处的联接类型。eq_ref查看PRIMARY或UNIQUE键。ref可能使用的索引不是PRIMARY / UNIQUE。
2.在哪里使用
使用where实际上是使用索引,如的输出key列所示explain。索引用于满足条件where ... S.E = 5,然后还用于在表中查找数据。
key
explain
where ... S.E = 5
如果索引覆盖并且不需要查询表中的数据,则可以看到using index(如果在没有使用条件的情况下)或using index; using where(如果在使用条件的情况下)
using index
using index; using where
此信息与Martin Seitl在其评论中提供的链接相同。
3.事件顺序
据我了解: