我正在尝试查看对JOINs
的理解是否正确。
对于以下查询:
SELECT * FROM tableA
join tableB on tableA.someId = tableB.someId
join tableC on tableA.someId = tableC.someId;
RDMS是否基本执行类似的伪代码,如下所示:
List tempResults
for each A_record in tableA
for each B_record in tableB
if (A_record.someId = B_record.someId)
tempResults.add(A_record)
List results
for each Temp_Record in tempResults
for each C_record in tableC
if (Temp_record.someId = C_record.someId)
results.add(C_record)
return results;
因此,基本上,具有相同
someId
和tableA
的tableB
和tableC
的记录越多,RDMS扫描的记录越多?如果所有3个表的记录都具有相同的someId
,那么实际上对所有3个表都进行了全表扫描吗?我的理解正确吗?
最佳答案
每个供应商的查询处理器的编写(编码)当然略有不同,但是它们可能共享许多通用技术。可以通过多种方式来实现联接,在任何供应商的实现中,选择哪种联接都将取决于具体情况,但是要考虑的因素包括数据是否已经按联接属性进行了排序,每个表中相对记录的数量(一组数据中的20条记录与另一条数据中的一百万条记录之间的连接,与每组记录具有可比较大小的记录的执行方式不同)。我不知道MySQL的内部原理,但是对于SQL Server,有三种不同的联接技术,即合并联接,循环联接和哈希联接。看一看this。