【问题标题】:understanding MySQL Explain output理解 MySQL Explain 输出
【发布时间】:2016-03-11 07:11:49
【问题描述】:

我有几个关于 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. 我在 S.E 上创建了一个索引,为什么它在 Extra 列中显示 Using where? 而不是 Using Index?它特别声明它通过查看KEY column : SE 来使用索引
  3. 就操作顺序而言,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 |
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+

数据集

  • 表 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;

【问题讨论】:

  • 请采用文本格式的架构
  • 这里找到问题 2 的答案:stackoverflow.com/a/9534935/2022209
  • 为什么这个问题被否决了? OP 提出了一个很好的尝试来提出这个问题。

标签: mysql sql database explain sql-execution-plan


【解决方案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_refref 引用相同的示例时,也会出现混淆:

SELECT * FROM ref_table,other_table 
WHERE ref_table.key_column=other_table.column;

总的来说,当 explain 提到 ref 和 eq_ref 时,我会查看各自的表以查看它们属于哪种联接。eq_ref 查看 PRIMARY 或 UNIQUE 键。 ref 可能正在使用 PRIMARY/UNIQUE 以外的索引。

2。使用位置

使用 where 实际上是使用索引,如 explain 输出的 key 列所示。索引用于满足where ... S.E = 5,然后也用于查找表中的数据。

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

此信息与link Martin Seitl provided in his comments 相同

3.事件顺序

据我了解:

  • MySQL 首先在 S.E 索引中查找常量值 where ... S.E = 5
  • 然后它在表 S 中查找 S.RID
  • 然后,它将迄今为止发现的记录与 R.RID 进行匹配
  • 最合适的方法是访问 R 的主键,即 RID(因此 R 具有 eq_ref)
  • 由于 R.RID 主键实际上是整行,所以 R.B = 5 很容易满足。所以不需要做其他工作

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 2012-12-17
    • 1970-01-01
    • 2015-08-19
    • 2016-09-20
    • 2011-12-27
    • 2015-09-14
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多