【问题标题】:Is it better to traverse through a PHP array than traversing through MySQLi associative array?遍历 PHP 数组是否比遍历 MySQLi 关联数组更好?
【发布时间】:2017-03-04 12:39:34
【问题描述】:

我有以下代码,其中我使用循环内的循环来创建 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 循环相同?哪个更优化?

【问题讨论】:

  • 不清楚为什么需要一个 php 循环。但是您的示例并未解释您为什么要这样做。性能方面考虑加入。假设 mysql 或 mariadb 开发人员在 C 甚至汇编方面做得很好,可能比在 PHP 中做得更好。单个查询即使生成冗余数据也会有更好的性能。

标签: php mysql optimization mysqli query-optimization


【解决方案1】:

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

这意味着,如果您首先用它填充一个 php 数组,或者只是继续做您现在正在做的事情,那么您案例中的外循环在性能上应该不会有太大差异。

您可以在此处实现的最大性能差异是是否可以将第二个内部循环查询组合成某种形式的连接到第一个查询。

在循环内向数据库发送多个查询是需要时间的。

【讨论】:

    【解决方案2】:

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

    ...那么你将迭代两次

    哪个更优化?

    运行一次循环比运行两次循环更优化。所以它让你的问题更多的是算术,而不是优化。

    不过,我更关心的是优化问题。

    那么你必须在你的第一个查询中使用 JOIN 并在没有嵌套查询的情况下获取所有数据。

    【讨论】:

      【解决方案3】:

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

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

      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)");
      

      与所有优化一样:在优化之前,找出瓶颈所在。优化后,确认瓶颈真的没有了。

      【讨论】:

        猜你喜欢
        • 2012-06-26
        • 1970-01-01
        • 2013-05-23
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多