【问题标题】:PHP mysqli_query is taking too longPHP mysqli_query 耗时太长
【发布时间】:2016-02-25 10:11:29
【问题描述】:

我这里有问题。这是我的代码

$res = mysqli_query($conn, "SELECT * FROM ( SELECT * FROM ( SELECT m.subnum, ma.cd 
FROM tr_mcerr AS m LEFT JOIN tr_mcerract AS ma ON m.subnum = ma.subnum 
order by ma.dtact DESC ) AS A GROUP BY A.subnum ) 
AS B WHERE B.cd = '01'") or die(mysqli_error($conn));

$totalRows_1 = mysqli_num_rows($res);

如您所见,我只想获取行数。现在的问题是,仅此代码就需要大约 2 秒才能完成。还有 5 个这样的代码,但具有不同的表和字段。因此,要完全加载页面大约需要 13 秒才能完成。

还有其他解决方案吗?
可能导致执行时间长的原因是什么?

谢谢

【问题讨论】:

  • 好吧,您可以使用SELECT count(*) 来计算,这就是其中的一部分。此外,为 JOIN 语句中包含的字段添加索引将显着提高性能。
  • 删除 sub-select 中的 Order by 。我没有看到它有任何用处

标签: php mysql sql mysqli


【解决方案1】:

这是您的查询:

SELECT *
FROM (SELECT *
      FROM (SELECT m.subnum, ma.cd 
            FROM tr_mcerr AS m LEFT JOIN
                 tr_mcerract AS ma
                 ON m.subnum = ma.subnum 
           order by ma.dtact DESC
          ) AS A
     GROUP BY A.subnum
    ) AS B
 WHERE B.cd = '01';

如果您只想要行数,那真是一团糟!对于许多子查询和不必要的ORDER BY

这是一个更简单的版本:

SELECT COUNT(DISTINCT m.subnum)
FROM tr_mcerr m LEFT JOIN
     tr_mcerract ma
     ON m.subnum = ma.subnum 
WHERE b.cd = '01';

您可能会说:“哦,这会返回一个不同的值。”但是,那是因为您的查询是基于 indeterminate 结果的。你有SELECT *GROUP BY 并且以某种方式神奇地期望MySQL 准确地找出你打算用于未聚合列的行。尽管 MySQL 文档对这一点非常明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2018-02-27
    • 2013-05-28
    相关资源
    最近更新 更多