什么是最佳解决方案,使用内部联接还是多个查询?

时间:2014-01-29 13:12:20

标签: mysql sql

什么是最佳解决方案,使用内部联接还是多次查询?

类似这样的事情:

 SELECT * FROM brands
 INNER JOIN cars
     ON brands.id = cars.brand_id 

或者像这样:

SELECT * FROM brands

...(同时查询)......

SELECT * FROM cars WHERE brand_id = [row(brands.id)]

5 个答案:

答案 0 :(得分:3)

一般来说,一个查询更好,但有一些警告。例如,如果您执行的联接超过七个,则旧版本的SQL Server的性能会大幅下降。答案将取决于数据库引擎,版本,查询,架构,字段等,所以我们不能肯定哪个更好。始终考虑尽可能减少查询的数量,而不要过于夸大并创建疯狂或无法维护的结果集。

答案 1 :(得分:2)

这是一个非常主观的问题,但请记住,每次调用数据库都会产生很大的开销。

几乎无一例外,最佳方法是发出少量命令并提取您需要的所有数据。但是出于实际原因,这显然是不可能的。

一般来说,如果数据库维护得很好,一个查询就会比两个查询快。如果不是,您需要查看您的数据/指标并确定原因。

最后一点,你在第二个例子中暗示你要加载品牌然后发出命令来获得每个品牌的所有汽车。这毫无疑问是你最糟糕的选择,因为它没有发出2个命令 - 它发出N + 1,其中N是你拥有的品牌数量...... 100个品牌是101个DB命中!

答案 2 :(得分:2)

您的两个查询并不完全相同。

第一行返回一行中brandscars的所有字段。第二个返回需要组合在一起的两个不同的结果集。

通常,最好在数据库中执行尽可能多的操作。数据库更有效地处理大量数据。而且,它通常会减少返回给客户端的数据量。

也就是说,在一些情况下,单个查询中返回的数据多于多个查询。例如,在您的示例中,如果您有一个包含100列的品牌记录和包含三列的10,000个汽车记录,则双查询方法可能更快。您只需从brands表中返回一次而不是10,000次的列。

这些多个查询更好的例子很少见。通常,最好在数据库中进行处理。如果需要提高性能,那么在极少数情况下,您可以分解查询并提高性能。

答案 3 :(得分:1)

通常,使用第一个查询。为什么?因为查询执行时间不仅仅是查询本身的时间,还有一些开销,例如:

  • 创建连接开销
  • 网络数据发送开销
  • 关闭(处理)连接开销

根据情况,可能存在或不存在一些管理费用。例如,如果您使用持久连接,那么您将无法获得连接开销。但是,在通常情况下,这不是真的,因此,它将会存在。创建/维护/关闭连接开销是非常重要的一部分。想象一下,这个开销只占总查询时间的1%(实际情况会更多)。你有 - 比如1000,000行。然后,第一个查询将只产生一次开销,而第二次将是1.000.000/100 = 10.000次。试想一下 - 它会有多慢。

此外,INNER JOIN也将使用密钥完成 - 如果它存在,因此,就查询本身速度而言,它将与第二个几乎相同。所以我强烈建议使用INNER JOIN选项。

在非常具体的情况下,将复杂查询分解为简单查询可能很有用。例如,IN子查询的大小写。在这种情况下,如果您正在使用WHERE id IN (subquery),其中(subquery)是一些SQL,MySQL会将其视为= ANY子查询,并且不会使用密钥,即使子查询导致缩小ids列表。并且 - 是的,将它分成两个查询可能有意义,因为WHERE IN(static list)将以另一种方式工作 - MySQL将使用范围索引扫描(奇怪,但是正确 - 因为IN (static list)语句{{1}将被视为比较运算符,而不是IN子查询限定符。这部分不是直接关于你的情况 - 但是为了表明 - 是的,当从DBMS分割处理在性能方面可能有用时 - 存在。

答案 4 :(得分:1)

一个查询更好,因为执行查询的费用高达约90%是在开销中:

  • 与数据库之间的通信流量
  • 语法检查
  • 权限检查
  • 优化程序的访问计划计算
  • 登录
  • 锁定(甚至只读需要锁定)
  • 很多其他的东西

对于一个查询只执行一次,或者对n个查询执行n次,但获取相同的数据。