一尘不染

了解MySQL说明输出

sql

我对MySQL有几个问题的解释。

  1. 在评估的第一步中,它将REF用于联接类型。但是,根据我对ref的研究,它指出以下内容:All rows with matching index values are read from this table for each combination of rows from the previous tables.上一个表格是什么?如果前一个表是初始步骤,该怎么办?
  2. 我在SE上创建了索引,为什么它Using where?在Extra列而不是状态Using Index?并通过查看KEY column : SE
  3. 就操作顺序而言,MySQL是否按此顺序进行所有处理?SE = 5使用索引,R.Rid = S.Rid使用上一步的记录,RB = 5使用上一步的记录?

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行和以下字段:

    • RID(主键):1到100,000之间的整数
    • B:1到10的随机均匀分布的整数
    • C:1到1,000之间的随机均匀分布的整数
    • 表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;

阅读 114

收藏
2021-05-16

共1个答案

一尘不染

此查询也可以像这样重写:

 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的refeq_ref容易引起混淆。这里有两个表。每个人都将另一个人称为上表(这是我的解释)。这里的联接为inner join,因此数据库将所有R记录与S进行匹配,并且如果RID匹配,则仅考虑那些适合查看的记录。

当文档同时针对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,然后还用于在表中查找数据。

如果索引覆盖并且不需要查询表中的数据,则可以看到using index(如果在没有使用条件的情况下)或using index; using where(如果在使用条件的情况下)

此信息与Martin Seitl在其评论中提供的链接相同。

3.事件顺序

据我了解:

  • MySQL首先在SE索引中查找一个常数where ... S.E = 5
  • 然后,它在表S中查找S.RID
  • 然后,它匹配到目前为止使用R.RID发现的记录
  • 最合适的方法是到达R的主键,即RID(因此R具有eq_ref)
  • 由于R.RID主键实际上是整个行,因此可以轻松满足RB = 5。因此,无需执行其他任何工作
2021-05-16