理解 MySQL 解释输出
understanding MySQL Explain output
我有几个关于 MySQL 解释的问题。
- 在评估的第一步中,它使用 REF 作为连接类型。但是,根据我对 ref 的研究,它指出以下内容:
All rows with matching index values are read from this table for each combination of rows from the previous tables.
上一个 table 是什么?如果是第一步,怎么会有前面的table?
- 我在 S.E 上创建了一个索引,为什么它在 Extra 列中显示
Using where?
而不是 Using Index
?它通过查看 KEY column : SE
明确说明它使用索引
- 就操作顺序而言,MySQL是否按此顺序进行处理? S.E = 5 使用索引,R.Rid = S.Rid 使用上一步的记录,R.B = 5 使用上一步的记录?
S.E
上的索引
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 |
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+
数据集
Table R 有 100,000 行和以下字段:
- RID(主键):1 到 100,000 之间的整数
- B:从 1 到 10 的随机均匀分布整数
- C:从 1 到 1,000 的随机均匀分布整数
Table S 有 500,000 行和以下字段:
- SID(主键):1到500,000的整数
- RID(R 的外键):从 1 到 100,000 的随机均匀分布整数
- D:从1到100的随机均匀分布整数
- E:1到100,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.前面是什么table
http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 上 ref
和 eq_ref
的措辞可能有些令人困惑。这里有两个table。每一个都将另一个称为前一个 table(这是我的解释)。这里的join是inner join
,所以数据库将所有R记录与S匹配,如果RID匹配,则只考虑那些记录suitable进行审核。
当文档针对 eq_ref
和 ref
引用相同示例时,也会出现混淆:
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
总的来说,当解释提到 ref 和 eq_ref 时,我查看各自的 tables 以查看它们属于哪种连接。eq_ref
查看 PRIMARY 或 UNIQUE 键. ref
可能正在使用 PRIMARY/UNIQUE 以外的索引。
2。使用 where
使用 where 实际上是在使用索引,如 explain
输出的 key
列所示。 Index用来满足where ... S.E = 5
,也用来在table.
中查找数据
如果索引被覆盖并且table中的数据不需要查找,您可以看到using index
(如果没有使用where条件)或using index; using where
(如果使用where条件)
此信息与 link Martin Seitl provided in his comments
相同
3。事件顺序
据我了解:
- MySQL 首先在 S.E 索引中查找常数值
where ... S.E = 5
.
- 然后在 table S
中查找 S.RID
- 然后它将迄今为止发现的记录与 R.RID
进行匹配
- 最合适table的方法是获取 R 的主键,即 RID(因此 R 有 eq_ref)
- 因为R.RID主键其实就是整行,所以R.B=5很容易满足。所以不需要做其他工作
我有几个关于 MySQL 解释的问题。
- 在评估的第一步中,它使用 REF 作为连接类型。但是,根据我对 ref 的研究,它指出以下内容:
All rows with matching index values are read from this table for each combination of rows from the previous tables.
上一个 table 是什么?如果是第一步,怎么会有前面的table? - 我在 S.E 上创建了一个索引,为什么它在 Extra 列中显示
Using where?
而不是Using Index
?它通过查看KEY column : SE
明确说明它使用索引
- 就操作顺序而言,MySQL是否按此顺序进行处理? S.E = 5 使用索引,R.Rid = S.Rid 使用上一步的记录,R.B = 5 使用上一步的记录?
S.E
上的索引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 |
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+
数据集
Table R 有 100,000 行和以下字段:
- RID(主键):1 到 100,000 之间的整数
- B:从 1 到 10 的随机均匀分布整数
- C:从 1 到 1,000 的随机均匀分布整数
Table S 有 500,000 行和以下字段:
- SID(主键):1到500,000的整数
- RID(R 的外键):从 1 到 100,000 的随机均匀分布整数
- D:从1到100的随机均匀分布整数
- E:1到100,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.前面是什么table
http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 上 ref
和 eq_ref
的措辞可能有些令人困惑。这里有两个table。每一个都将另一个称为前一个 table(这是我的解释)。这里的join是inner join
,所以数据库将所有R记录与S匹配,如果RID匹配,则只考虑那些记录suitable进行审核。
当文档针对 eq_ref
和 ref
引用相同示例时,也会出现混淆:
SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
总的来说,当解释提到 ref 和 eq_ref 时,我查看各自的 tables 以查看它们属于哪种连接。eq_ref
查看 PRIMARY 或 UNIQUE 键. ref
可能正在使用 PRIMARY/UNIQUE 以外的索引。
2。使用 where
使用 where 实际上是在使用索引,如 explain
输出的 key
列所示。 Index用来满足where ... S.E = 5
,也用来在table.
如果索引被覆盖并且table中的数据不需要查找,您可以看到using index
(如果没有使用where条件)或using index; using where
(如果使用where条件)
此信息与 link Martin Seitl provided in his comments
相同3。事件顺序
据我了解:
- MySQL 首先在 S.E 索引中查找常数值
where ... S.E = 5
. - 然后在 table S 中查找 S.RID
- 然后它将迄今为止发现的记录与 R.RID 进行匹配
- 最合适table的方法是获取 R 的主键,即 RID(因此 R 有 eq_ref)
- 因为R.RID主键其实就是整行,所以R.B=5很容易满足。所以不需要做其他工作