循环中的 MySQL 查询与使用 SQL 连接

Posted

技术标签:

【中文标题】循环中的 MySQL 查询与使用 SQL 连接【英文标题】:MySQL query in a loop vs using a SQL join 【发布时间】:2013-08-26 15:04:24 【问题描述】:

我的公司内部正在就这件事上的循环查询进行内部辩论:

$sql = "
  SELECT foreign_key
  FROM t1";

foreach(fetchAll($sql) as $row)

  $sub_sql = "
    SELECT *
    FROM t2
    WHERE t2.id = " . $row['foreign_key'];

  foreach(fetchAll($sub_sql) as $sub_row)
  
    // ...
  

而不是像这样使用 sql 连接:

$sql = "
  SELECT t2.*
  FROM t2
  JOIN t1
  ON t1.foreign_key = t2.id";

foreach(fetchAll($sql) as $row)

  // ...


有关此的其他信息,数据库很大,有数百万行。

我当然已经搜索过这个问题的答案,但是没有人能以好的方式回答这个问题,并且有很多赞成票让我确信一种方法比另一种更好。

问题

有人可以向我解释为什么其中一种方法比另一种更好吗?

【问题讨论】:

视情况而定。多重选择是否比连接快,没有单一的答案。您将不得不自己测试哪个更快。另请查看:***.com/questions/1067016/… 【参考方案1】:

join 方法通常被认为更好,因为它减少了向数据库来回发送查询的开销。

如果您在表上有适当的索引,那么这两种方法的基本性能将是相似的。也就是说,这两种方法都将使用适当的索引来获取结果。

从数据库的角度来看,join 方法要优越得多。它将数据逻辑整合在一个地方,使代码更加透明。它还允许数据库进行在应用程序代码中可能不明显的优化。

【讨论】:

我不得不说我一般不同意,不是因为你错了,而是因为我也用 php 编程。我的数据通常由 3 个以上的关系关联。当您必须根据关系吐出 html 元素时,加入该数据以获取一个结果会使阅读变得越来越困难。即,一旦您进行连接,关系的知识就会丢失或难以收集,这通常在查询之后需要......但连接通常会更快。 @gunslingor 和 Gordon,我最近刚刚遇到一个问题,即未经允许为该列添加索引的数据库表很大,在这种情况下,它使用循环是否比在未索引的查询上更有效列? @tim 。 . .数据库应该仍然比循环快,因为数据只需要进出数据库一次。不过,两者都会很慢。【参考方案2】:

由于驱动程序开销,循环的效率要低得多

这与我回答的另一个问题相似,但与 cv 不同。 My full answer is here 不过我总结一下要点:

每当您连接到数据库时,都会执行三个步骤:

    与数据库的连接已建立。 对数据库执行一个或多个查询。 返回数据进行处理。

使用循环结构,最终会产生额外的驱动程序请求开销,每个循环周期都会有一个请求和一个返回,而不是单个请求和单个返回。即使循环查询不比单个大查询花费任何时间(这不太可能,因为 mysql 内部内置了很多快捷方式来防止使用完整的重复循环),您仍然会发现单个查询更快司机开销。

使用没有TRANSACTIONS 的循环,您还会发现您会遇到关系数据完整性问题,其中其他操作会影响您在循环周期之间迭代的数据。同样,使用事务会增加开销,因为数据库必须维护两个持久状态。

【讨论】:

以上是关于循环中的 MySQL 查询与使用 SQL 连接的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 多连接与原子更新 sql 查询 [竞争条件]

MySQL学习——SQL查询语句(连接查询&子查询)

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥

MySql数据库与JDBC编程三

Mysql常用sql脚本与配置管理(密码忘记,角色管理,分表,连接数,高并发,索引,级联查询)

Mysql:视图与循环表连接