在表JOIN中实际发生了什么?

Gli*_*ide 6 mysql sql rdms

我试图看看我的理解JOINs是否正确.

对于以下查询:

SELECT * FROM tableA 
   join tableB on tableA.someId = tableB.someId
   join tableC on tableA.someId = tableC.someId;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

所以基本上更多的记录与同someId tableAtableBtableC,更记录了关系数据库管理系统具有扫描?如果所有3个表都有相同的记录someId,那么基本上对所有3个表进行全表扫描?

我的理解是否正确?

Cha*_*ana 4

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