mysql in clause vs big table join

时间:2015-10-23 12:56:48

标签: mysql

我有一个查询,它通过连接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

还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

我认为最好的选择是尝试两种方法并对它们进行解释。 最后,您可以进行的一个优化是使用第二种方法的存储过程,这将减少必须从客户端运行2个查询的时间/开销。

最后,对于非常大的桌子来说,加入是一项非常昂贵的操作,因为你基本上投射并选择超过1米X 1米的行。 (条款:What are projection and selection?

答案 1 :(得分:0)

您的问题没有明确的答案,您可以分析两种方式,因为它们取决于多种因素。

然而,通常采用第一种方法,如果所有表都被正确编入索引并且行的大小为"标准"则应该更快。 还要考虑到在第二种方法中,网络通信的延迟会更糟,因为您需要多次访问数据库。