我正在尝试查看对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;

因此,基本上,具有相同someIdtableAtableBtableC的记录越多,RDMS扫描的记录越多?如果所有3个表的记录都具有相同的someId,那么实际上对所有3个表都进行了全表扫描吗?

我的理解正确吗?

最佳答案

每个供应商的查询处理器的编写(编码)当然略有不同,但是它们可能共享许多通用技术。可以通过多种方式来实现联接,在任何供应商的实现中,选择哪种联接都将取决于具体情况,但是要考虑的因素包括数据是否已经按联接属性进行了排序,每个表中相对记录的数量(一组数据中的20条记录与另一条数据中的一百万条记录之间的连接,与每组记录具有可比较大小的记录的执行方式不同)。我不知道MySQL的内部原理,但是对于SQL Server,有三种不同的联接技术,即合并联接,循环联接和哈希联接。看一看this

10-05 19:25