理解 MySQL 解释输出

understanding MySQL Explain output

我有几个关于 MySQL 解释的问题。

  1. 在评估的第一步中,它使用 REF 作为连接类型。但是,根据我对 ref 的研究,它指出以下内容:All rows with matching index values are read from this table for each combination of rows from the previous tables. 上一个 table 是什么?如果是第一步,怎么会有前面的table?
  2. 我在 S.E 上创建了一个索引,为什么它在 Extra 列中显示 Using where? 而不是 Using Index?它通过查看 KEY column : SE
  3. 明确说明它使用索引
  4. 就操作顺序而言,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 |
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+

数据集

查询

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.htmlrefeq_ref 的措辞可能有些令人困惑。这里有两个table。每一个都将另一个称为前一个 table(这是我的解释)。这里的join是inner join,所以数据库将所有R记录与S匹配,如果RID匹配,则只考虑那些记录suitable进行审核。

当文档针对 eq_refref 引用相同示例时,也会出现混淆:

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很容易满足。所以不需要做其他工作