我有一个查询,它通过连接3个大表(每个约1毫米记录)来获取数据,此外它们是非常繁忙的表。
做传统连接更好吗?或者更确切地说,首先从第一个表中获取值,然后执行二次查询,传递在子句中以逗号分隔的方式检索的值?
选项#1
SELECT *
FROM BigTable1 a
INNER JOIN BigTable2 b using(someField2)
INNER JOIN BigTable3 c using(someField3)
WHERE a.someField1 = 'value'
VS
选项#2
$values = SELECT someField2 FROM WHERE someField1 = 'value'; #(~20-200 values)
SELECT *
FROM BigTable2
INNER JOIN BigTable3 c using(someField1)
WHERE someField2 in ($values)
选项#3
创建临时表以存储BigTable1中的这些值 并使用它而不是直接加入BigTable1
还有其他选择吗?
答案 0 :(得分:0)
我认为最好的选择是尝试两种方法并对它们进行解释。 最后,您可以进行的一个优化是使用第二种方法的存储过程,这将减少必须从客户端运行2个查询的时间/开销。
最后,对于非常大的桌子来说,加入是一项非常昂贵的操作,因为你基本上投射并选择超过1米X 1米的行。 (条款:What are projection and selection?)
答案 1 :(得分:0)
您的问题没有明确的答案,您可以分析两种方式,因为它们取决于多种因素。
然而,通常采用第一种方法,如果所有表都被正确编入索引并且行的大小为"标准"则应该更快。 还要考虑到在第二种方法中,网络通信的延迟会更糟,因为您需要多次访问数据库。