当我们使用关键字“explain”为SQL查询添加前缀时,我们会得到一个包含一些列的表。请告诉我什么是“类型”列。 eq_ref
和ref
在该背景下的含义。
答案 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”是指您的请求中创建的联接类型。从最好到最差,这里是列表:
您可以在MySQL文档中找到更详细的说明:http://dev.mysql.com/doc/refman/5.0/en/explain-output.html