我的 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
--------------------
- 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
这里有必要连接两个子查询,因为您需要两个按日期聚合才能使连接生效。
我有一个 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
--------------------
- 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
这里有必要连接两个子查询,因为您需要两个按日期聚合才能使连接生效。