【问题标题】:Performance issue in a php and mysql pagephp 和 mysql 页面中的性能问题
【发布时间】:2011-11-18 09:56:37
【问题描述】:

我遇到了一些 php 和 mysql 页面的性能问题。

我有一个类似的代码

mysql statement
    while loop fetching the record
    {
        foreach($somearray)
          {
            Another mysql statement while fetch records using a where clause using $somearray key and 1st while loop result row data.
           }
     }
    /*end while*/

邮件语句需要 462 条记录,第二个 foreach 运行 12 次。该页面加载速度非常慢,当我评论第二个 mysql 语句时,它加载速度很快。

那么我应该采取什么措施来更快地获取数据以及任何解决方案?

/** 问题更新**/

一个表是行方式的,即主 ID 是主要的。

第二个表中的数据位于多行中,即第一个表中的相同 ID 将有多行,我只需要从第二个表中获取特定月份的数据并将这两个表加入并显示在一个表中。

所以我正在使用该 foreach 循环数月。

【问题讨论】:

  • 由于我没有太多工作要做,我只想问您是否可以将部分代码集成到您的 mysql 查询中?我的意思是,如果您可以将您的 $somearray 绑定到另一个适用于第一个结果集的 mysql 语句?
  • 你为什么不展示使用你的表格的样子 + 更多关于你想要的数据。您可能可以使用一些连接或缓存来节省时间。
  • @Rich Bradshaw - 查看问题更新..

标签: php mysql


【解决方案1】:

您可能会为每个顶级实体发出 N+1 个(以 ORM 术语表示)查询。您应该加入数据并至少避免嵌套循环。

【讨论】:

  • 我会使用连接,但是我必须在 foreach 中循环第一个 mysql 语句,因为你需要这个 foreach 来构建查询。
【解决方案2】:

如果查询中的每一行运行 12 个单独的查询,那么您在该时间范围内运行了超过 5500 个查询。如果每个查询花费 10 毫秒(乐观),那么您仍然只需要 55 秒的 MySQL 查询。我会尝试删除或优化您的代码/查询,以尽量减少服务器上的负载。

一般的想法是,如果您无法帮助,请不要嵌套查询。

编辑

要一次从 2 个表中获取信息,您可以对 MySQL 使用连接,它将显示两个表中的所有信息,您可以运行 where 子句或通过循环来获取所有指定数据

SELECT * FROM tableName AS t1 INNER JOIN tableName2 AS t2 ON t1.name = t2.name;

【讨论】:

    【解决方案3】:

    您多次对 MySQL 结果执行繁重的操作。也许您想将您的第一条记录提取到一个 PHP 数据结构中,然后您可以使用它来执行第二个查询。

    你也可以考虑使用 PDO,也许可以加速,当 statemen 被缓存时。我想,foreach 循环中的语句始终相同,只是参数发生了变化。

    【讨论】:

    • 因此您可以在 foreach 循环之前准备您的语句,并且只在其中使用 bindParams。也许这可以加快速度。
    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多