【问题标题】:Is it faster to use two separate SQL statements or one SQL statement with JOIN?使用两个单独的 SQL 语句还是使用一个带有 JOIN 的 SQL 语句更快?
【发布时间】:2011-06-13 12:54:01
【问题描述】:

我对“两个或多个单独的 SQL 命令”或“1 但使用 'join' SQL 命令”的性能表示怀疑。

事情是这样的:

比如我有两张表:post,user

post 有一个 user_id 表示此帖子是由user 中的某个用户发布的

我将同时提取帖子和用户名。

我也可以

SELECT * FROM `post` LEFT JOIN `user` on post.user_id = user.id WHERE 1

$rows = $db->sql("SELEFT * FROM `post` WHERE 1") 对于 $rows 中的 $row: $db->sql("SELECT * FROM `user` WHERE id = $row['user_id']")

我想知道哪个性能更好?

如果我有 3 个或更多表要加入,哪种方式会更好(从性能角度来看)?

【问题讨论】:

  • 与 INNER JOIN 相比,使用 LEFT JOIN(或 RIGHT JOIN 或 FULL JOIN)有一个(通常很小,但不是零)性能损失。如果可以,请避免使用 LEFT JOIN 并仅使用 JOIN。你会有没有用户记录的帖子吗?如果不是(你不应该),那么 INNER JOIN 是合适的。

标签: mysql


【解决方案1】:

连接几乎总是会带来更好的性能。即使它检索的数据“很大”,您仍然只执行一个查询。

这就像买杂货一样。开车去商店一次,装满购物车,然后带着许多不同的物品回家,而不是去商店,买一件东西,回家,再去商店,再买一件。

每次旅行加起来,你最终会花更多的时间开车而不是享受你的杂货。

【讨论】:

  • 谢谢!我认为这是一个很好的例子,我现在明白了。
【解决方案2】:

强烈建议使用 LEFT JOIN,否则将查询放入循环中(如第二个示例中所示)会多次命中您的数据库,这也是一种危险情况。

【讨论】:

    【解决方案3】:

    请注意,您没有执行 2 个查询。您正在执行第一个查询一次,第二个查询执行 N 次,其中 N 是第一个查询返回的行数。这将比让查询优化器处理单个连接查询要昂贵得多。

    数据库优化器由专家精心编写,以最大限度地降低运营成本。如果您尝试通过运行单独的查询来猜测优化器,那么您每次都应该输得很惨——除非优化器严重破坏了它。除此之外,DBMS 必须在每次调用第二条语句时准备变体,而不仅仅是一次。优化器必须错得离谱,以至于根本不会发生。

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2017-02-17
      • 1970-01-01
      • 2015-09-28
      • 2018-07-09
      相关资源
      最近更新 更多