了解MySQL解释输出

时间:2015-12-06 18:03:41

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

我有几个关于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. 来使用索引
  4. 就操作顺序而言,MySQL是否按此顺序执行所有操作? S.E = 5使用索引,R.Rid = S.Rid使用前一步骤的记录,R.B = 5使用前一步骤的记录?
  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 |
    +----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+
    

    DATASET

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

1 个答案:

答案 0 :(得分:2)

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

 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。什么是上表

ref eq_refinner join的{​​{3}}上的措辞可能会有些混乱。这里有两张桌子。每一个都引用另一个作为上一个表(这是我的解释)。这里的连接是eq_ref,因此数据库将所有R记录与S匹配,并且只考虑那些RID匹配时适合审阅的记录。

当文档引用refSELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; 的相同示例时,也会出现混淆:

eq_ref

总的来说,当解释提到ref和eq_ref时,我会查看相应的表以查看它们所处的连接类型。ref查看PRIMARY或UNIQUE键。 key可能正在使用PRIMARY / UNIQUE之外的索引。

<强> 2。使用

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

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

此信息与http://dev.mysql.com/doc/refman/5.7/en/explain-output.html

相同

第3。事件顺序

我的理解是:

  • MySQL首先在S.E索引中查找常量值array1 = [{model: 1995}, {type: "automatic"}] array2 = [{model: 2002}, {type: "automatic"}] array3 = [{model: 1995}, {type: "automatic"}] array4 = [{model: 2002}, {type: "automatic"}]
  • 然后在表S中查找S.RID
  • 然后匹配迄今为止用R.RID发现的记录
  • 最合适的方法是伸手去拿R的主键,即RID(因此R有eq_ref)
  • 由于R.RID主键实际上是整行,因此可以容易地满足R.B = 5。所以不需要做其他工作