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

时间:2016-12-27 02:32:28

标签: mysql sql rdms

我正试着看看我对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 tableAtableBtableC相同的记录越多,RDMS扫描的记录就越多?如果所有3个表都有相同someId的记录,那么基本上对所有3个表进行全表扫描?

我的理解是否正确?

1 个答案:

答案 0 :(得分:4)

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