30

当我们在 SQL 查询前加上关键字“explain”时,我们会得到一个包含一些列的表。请告诉我什么是“类型”列。eq_ref在这种情况下是什么ref意思。

4

2 回答 2

86

我会尝试解释...

eq_ref – 假设您有两个表。表 A 包含列 (id, text),其中 id 是主键。表 B 具有相同的列(id、text),其中 id 是主键。表 A 有以下数据:

1, Hello 
2, How are

表 B 有以下数据:

1, world!
2, you?

将 eq_ref 想象为 A 和 B 之间的 JOIN:

select A.text, B.text where A.ID = B.ID

此 JOIN 非常快,因为对于表 A 中扫描的每一行,表 B 中只能有一行满足 JOIN 条件一个,不超过一个。那是因为 B.id 是唯一的。
你在这里:说明服务器端处理的伪代码:

foreach (rowA in A)
{
    if (existsInBRowWithID(rowA.id)
    {
        addToResult(rowA.text, getRowInBWithID(rowA.id).text);
    }
}

ref - 现在想象另一个表 C 的列 (id, text),其中 id 是索引,但不是唯一的。表 C 有以下数据:

1, John!
1, Jack!

将 ref 想象为 A 和 C 之间的 JOIN:

select A.text, C.text where A.ID = C.ID

这是:说明服务器端处理的伪代码:

foreach (rowA in A)
{
    foreach (rowC in C)
    {
        if (rowA.id == rowC.id)
        {
            addToResult(rowA.text, rowC.text);
        }
    }
}

此 JOIN 不如前一个快,因为对于表 A 中扫描的每一行,表 C 中有几个可能的行可能满足 JOIN 条件(嵌套循环)。那是因为 C.ID 不是唯一的。

我希望这会有所帮助...

干杯!

于 2010-12-24T21:37:37.003 回答
30

“类型”是指在您的请求中提出的加入类型。从最好到最差,这里是列表:

  • 系统
  • 常量
  • eq_ref
  • 参考
  • 范围
  • 指数
  • 全部

您将在 MySQL 文档中找到更详细的解释:http: //dev.mysql.com/doc/refman/5.0/en/explain-output.html

于 2010-12-22T10:12:49.057 回答