遍历PHP数组比遍历mysql关联数组好吗?


Is it better to traverse through a PHP array than traversing through MySQLi associative array?

我有以下代码,其中我使用循环中的循环来创建一个PHP数组:

$result= mysqli_query($myqueri1);
    while($row = mysqli_fetch_assoc($result)) 
    { 
     $result1=mysqli_query($myqueri2); //This query utilizes a variable obtained from the outer loop. So this cant be written outside the loop.
     while($row = mysqli_fetch_assoc($result)) 
     {
     //Operations
     }
    }

这两个数组包含近50k行。而且它们是有索引的。

然而,我更关心的是优化问题。如果我将循环1的所有结果存储到PHP数组中,然后遍历它,会有什么不同吗?或者使用while($row = mysqli_fetch_assoc($result))与通过一个常见的PHP循环是一样的?哪个更优化?

访问数据库比访问数组元素慢。但是,如果数组来自数据库访问,则应该没有太大区别。

我怀疑你的说法"所以这不能写在循环之外。"例如

for ($i = 0; $i < 3, ++$i) {
  mysqli_query("SELECT foo FROM bar WHERE id = $i");
}

可以写成

mysqli_query("SELECT foo FROM bar WHERE id IN (0, 1, 2)");
与所有优化一样:在优化之前,找出瓶颈在哪里。优化后,确认瓶颈确实消失了。

如果我将循环1的所有结果存储到PHP数组中,然后遍历它,

…那么你将迭代两次

哪个更优化?

运行一次循环比运行两次循环更优化。所以这使得你的问题更像是算术,而不是优化。

然而,我更关心的是优化问题。

那么你必须使用JOIN在你的第一个查询,并获得所有的数据没有嵌套查询。

如果您使用带有默认标志MYSQLI_STORE_RESULTmysqli_query(),则您已经将整个结果集从数据库传输到应用程序中。请参阅http://php.net/manual/en/mysqli.query.php,特别是result_mode标志,以及mysqli_store_result()与mysqli_use_result(),以更好地解释这些标志的作用。

这意味着在你的情况下,外部循环应该不会有太大的性能差异,如果你第一次用它填充一个php数组,或者只是继续做你现在做的事情。

最大的性能差异在于是否有可能将第二个内循环查询合并为与第一个查询的某种连接。

在循环中向数据库发送多个查询将会花费时间。