MySQL解释了eq_ref和ref类型的含义

时间:2010-12-22 10:07:03

标签: mysql database optimization explain

当我们使用关键字“explain”为SQL查询添加前缀时,我们会得到一个包含一些列的表。请告诉我什么是“类型”列。 eq_refref在该背景下的含义。

2 个答案:

答案 0 :(得分:34)

我会尝试解释......

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中只能有 ONE 行满足JOIN条件。一个,不超过一个。那是因为B.id是独一无二的。这里是一个代码,用于说明服务器端的处理:

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

ref - 现在假设另一个表C包含列(id,text),其中id是索引但非UNIQUE。表C具有以下数据:

1, John!
1, Jack!

想象一下参考作为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中有 SEVERAL 可能的行,这些行可能满足JOIN条件(上面的循环没有中断) 。那是因为C.ID不是独一无二的。

我希望有帮助...

Cheerz!

答案 1 :(得分:10)

“type”是指您的请求中创建的联接类型。从最好到最差,这里是列表:

  • 系统
  • 常量
  • eq_ref
  • REF
  • 范围
  • 索引
  • 所有

您可以在MySQL文档中找到更详细的说明:http://dev.mysql.com/doc/refman/5.0/en/explain-output.html