繁体   English   中英

使用 VIEW 和 LEFT OUTER JOIN 进行慢查询

[英]Slow query with VIEW and LEFT OUTER JOIN

我试图以图表的形式获取 30 天的交易总额视图。 目前使用 VIEW 日期和 LEFT OUTER JOIN 来获取数据。 这有效,显示了我所有交易的总和,并且仍然包括 0 表示没有交易的天数等。

问题是事务表非常大。 所以 LEFT OUTER JOIN 做了很多工作......而且速度很慢。 这是原始查询:

SELECT IFNULL(SUM(Total), 0) AS OrderTotal, MONTH(dates.date) AS Month, YEAR(dates.date) AS Year, DAY(dates.date) AS Day
FROM dates LEFT OUTER JOIN tblTransactions
ON DATE(tblTransactions.TransDate) = dates.date
WHERE dates.date > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DAY(dates.date), MONTH(dates.date)
ORDER BY dates.date
LIMIT 30

为了加快速度,我认为最好添加一个额外的 WHERE 条件并且只查看超过 30 天的交易。 这令人难以置信地加快了速度,并以为我拨打了它,但问题是只有在我有 30 天的交易时才好。 如果一天是 0 美元,它将返回 29 条具有此条件的记录。 不好。

SELECT IFNULL(SUM(Total), 0) AS OrderTotal, MONTH(dates.date) AS Month, YEAR(dates.date) AS Year, DAY(dates.date) AS Day
FROM dates LEFT OUTER JOIN tblTransactions
ON DATE(tblTransactions.TransDate) = dates.date
WHERE dates.date > DATE_SUB(NOW(), INTERVAL 30 DAY)
AND tblTransactions.TransDate > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DAY(dates.date), MONTH(dates.date)
ORDER BY dates.date
LIMIT 30

所以希望得到一些反馈来改进原始查询。 现在,我感觉 PHP for() 循环 - 循环 30 次和查询 30 次可能比我原来的 LEFT OUTER JOIN 单个查询要快。

left join中第二个表的过滤需要在on子句中为 go:

SELECT COALESCE(SUM(t.Total), 0) AS OrderTotal,
       MONTH(d.date) AS Month, YEAR(dates.date) AS Year, DAY(d.date) AS Day
FROM dates d LEFT OUTER JOIN
     tblTransactions t
     ON DATE(t.TransDate) = d.date AND
        t.TransDate > DATE_SUB(NOW(), INTERVAL 30 DAY)
WHERE d.date > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DAY(d.date), MONTH(d.date)
ORDER BY d.date
LIMIT 30;

注意:导致性能不佳的原因可能是此子句:

DATE(t.TransDate) = d.date

如果TransDate没有时间组件,那么这不是必需的。 如果此类查询的性能很重要,请仅为TransDate的日期组件添加计算列,并在该列上添加索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM