什么是更好的:作为一个查询的一部分加入或多个子选择语句

时间:2011-04-26 23:32:25

标签: mysql pdo

表现明智,哪有更好?
如果我在查询中有3个或4个join语句,或者使用嵌入式select语句从我的数据库中提取相同的信息作为一个查询的一部分?

4 个答案:

答案 0 :(得分:2)

我认为加入更好是因为:

  1. 它们更容易阅读。
  2. 您可以更好地控制是否要执行内部,左/右外部联接或完全外部联接
  3. 加入语句不能轻易被滥用来创建查询可憎的行为
  4. 使用连接更容易,查询优化器可以创建一个快速查询(如果内部选择很简单,它可能会运行相同,但更复杂的东西连接将起作用更好)
  5. 嵌入式select只能模拟left/right outer join
  6. 有时你不能使用连接来做事情,在这种情况下(并且只有那时)你将不得不回到内部选择。

答案 1 :(得分:1)

它取决于您的数据库:特别是表的大小,还有内存参数,有时甚至是表的索引方式。

在不到当前版本的MySQL上,存在一个查询的可能性,其中子选择比返回由连接构造的相同结果的查询慢得多。 (在MySQL 4.1天中,我看到差异大于一个数量级。)因此,我更喜欢用连接构建查询。

也就是说,有些类型的查询很难用连接构建,而子选择是真正做到这一点的唯一方法。

答案 2 :(得分:-1)

大多数数据库会将以下两个查询优化到同一个计划中,因此您是否这样做:

select A.a1, B.b1 from A left outer join B on A.id = B.a_id

select A.a1, (select B.b1 from B where B.a_id = A.id) as b1 from A

它最终是一样的。但是,在大多数情况下,对于非平凡的查询,您最好尽可能地使用连接,特别是因为使用子选择无法实现某些类型的连接(例如内部连接)。

答案 3 :(得分:-1)

假设数据库引擎绝对没有优化,我会说这取决于您需要数据的一致性。如果您在繁忙的数据库上执行多个SELECT语句,您正在查看的数据可能会快速更改,则可能会遇到数据不匹配的问题,在查询之间。

假设您的数据不包含相互依赖关系,那么多个查询将正常工作。但是,如果您的数据需要一致性,请使用单个查询。

这一观点归结为保持数据的交易安全。考虑一种情况,即您必须提取所有应收账款的总额,该应收账款与货币交易金额保持在一个单独的表中。如果有人要在您的两个查询之间添加另一笔交易,则应收帐款总额将与交易金额的总和不匹配。