eq_ref
eq_ref
- 想象你有两张桌子。表A包含列(id,text),其中id是主键。表B具有相同的列(id,text),其中id是主键。表A包含以下数据:
1, Hello
2, How are
- 1
- 2
表B有以下数据:
1, world!
2, you?
- 1
- 2
想象一下eq_ref
为A和B之间的JOIN:
select A.text, B.text where A.ID = B.ID
- 1
这个JOIN非常快,因为对于表A中扫描的每一行,表B中只能有一行满足JOIN条件。一个,不超过一个。那是因为B.id是独一无二的。在这里,您是一个伪代码,它说明了服务器端的处理:
foreach (rowA in A)
{
if (existsInBRowWithID(rowA.id)
{
addToResult(rowA.text, getRowInBWithID(rowA.id).text);
break;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
ref
ref
- 现在想象另一个带有列(id,text)的表C,其中id是索引但非UNIQUE
。表C具有以下数据:
1, John!
1, Jack!
- 1
- 2
想象一下ref
作为A和C之间的JOIN:
select A.text, C.text where A.ID = C.ID
- 1
在这里,您是一个伪代码,它说明了服务器端的处理:
foreach (rowA in A)
{
foreach (rowC in C)
{
if (rowA.id == rowC.id)
{
addToResult(rowA.text, rowC.text);
}
}
}
此JOIN不如前一个快,因为对于表A中扫描的每一行,表C中有几个可能的行,它们可以满足JOIN条件(上面的循环中没有中断)。那是因为C.ID不是独一无二的。