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