MySQL循环查询与使用SQL连接

sup*_*ero 7 php mysql sql

我正在公司内部讨论如何在这个问题上循环查询:

$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)
  {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

foreach(fetchAll($sql) as $row)
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

关于这个的额外信息,数据库是巨大的,数百万行.

我当然搜索了这个问题的答案,但是没有人能以一种好的方式回答这个问题,并且通过大量的投票让我确信一种方式比另一方更好.

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

Gor*_*off 10

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

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

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


Gli*_*ire 8

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

这类似于我回答的另一个问题,但不同于cv.我的完整答案在这里,但我将总结一下要点:

无论何时建立与数据库的连接,都需要执行三个步骤:

  1. 建立与数据库的连接.
  2. 执行对数据库的查询或多个查询.
  3. 返回数据以进行处理.

使用循环结构,最终会产生额外的驱动程序请求开销,在这种情况下,您将有一个请求和每个循环返回,而不是单个请求和单个返回.即使循环查询不比单个大型查询花费更长时间(这是非常不可能的,因为MySQL内部有很多内置的快捷方式来防止使用完整的重复循环),您仍然会发现单个查询更快司机开销.

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