我的 mySQL 查询花费太多时间(大约 12 秒)- 任何建议

my mySQL query takes too much time (about 12 seconds) - any suggestions

我有一个 mySQL 查询的问题,因为它花费了太多时间(大约 12 秒)table 有大约 70,000 条记录

这是我的查询:

SELECT  DATE(`orders`.`date`) AS `dater`,
        COUNT(*) AS `amount`,
        ( SELECT SUM(`amount`) FROM `payment`
              WHERE DATE(`dater`)=DATE(`payment`.`posted_date`)
        ) AS `charge`
    FROM `orders`
    GROUP BY `dater`
    ORDER BY `dater` DESC
    LIMIT 0,10

如您所见,有 2 tables 1. table: 订单 这是订单 tables 这里我们有 1 个主列:日期(我们需要在这里计算每天的订单)

样本:

--------------------
date        | id
--------------------
01-01-2017  | 1
--------------------
01-01-2017  | 2
--------------------
01-02-2017  | 3
--------------------
  1. table:付款方式: 这是付款 table 这里我们有 2 个主要列:posted_date、金额(我们需要在这里获取每天的金额字段总和)

样本:

--------------------
posted_date | amount
--------------------
01-01-2017  | 100
--------------------
01-01-2017  | 50
--------------------
01-02-2017  | 200
--------------------

所以最后结果应该是[日期、金额、费用]

肯定会在更短的时间内完成,因为这 12 秒是不可能完成的:D

我看到问题出在这个内部 SELECT:

(SELECT SUM(`amount`) FROM `payment`
    WHERE DATE(`dater`)=DATE(`payment`.`posted_date`)
) AS `charge`

关于如何避免在 SELECT 查询中创建 SELECT 的任何建议?

您有一个相关的子查询。 MySQL 的查询规划器以一种天真的方式处理这些问题,礼貌地说。

重构您的查询以改用联接。您的相关子查询看起来像这样作为可连接的查询。

           SELECT SUM(amount) charge,
                  DATE(posted_date) posted_date
             FROM payment
            GROUP BY DATE(posted_date)

这每天从付款中获取一行 table。

接下来,您需要从订单中获得类似的结果 table。

         SELECT DATE(date) AS dater,
                COUNT(*) AS amount
           FROM orders
          GROUP BY DATE(date)

然后,把这两个连在一起[=13​​=]

SELECT a.dater, a.amount, b.charge
  FROM (
         SELECT DATE(date) AS dater,
                COUNT(*) AS amount
           FROM orders
          GROUP BY DATE(date)
       ) a
  LEFT JOIN (
           SELECT SUM(amount) charge,
                  DATE(posted_date) posted_date
             FROM payment
            GROUP BY DATE(posted_date)
       ) b ON a.dater = b.posted_date
 ORDER BY a.dater DESC
 LIMIT 0,10

这里有必要连接两个子查询,因为您需要两个按日期聚合才能使连接生效。