我有三个表:MySQL的:一个大的内琛加入
mail_info
与列CustomerID, MailID, Opened
mail_ids
与列MailID, MailType, SendDate
mail_data
与列CustomerID, Item, Sales, PurchaseDate
我要总结的Sales
对于每个CustomerID
,按PurchaseDate
分组,并且还显示垃圾箱ary Opened
每个客户/日期对的数据。
推导basetable
是将每个MailID
与其在mail_data
中使用的相应日期相关联。
这里是我的查询:
SELECT CustomerID, Opened, SendDate, SUM(mail_data.Sales) FROM
(SELECT
mail_info.CustomerID,
mail_info.Opened,
mail_ids.SendDate
FROM mail_info
INNER JOIN mail_ids ON mail_info.MailID = mail_ids.MailID
WHERE mail_ids.MailType = 'E'
) AS basetable
INNER JOIN mail_data ON mail_data.PurchaseDate = basetable.SendDate
GROUP BY CustomerID, SendDate
ORDER BY CustomerID, SendDate ASC;
和期望的输出例如:
# CustomerID, Opened, SendDate, SUM
1, 1, 2017-01-03, 5.68
1, 0, 2017-01-04, 4.92
1, 0, 2017-01-05, 43.23
2, 1, 2017-01-03, 12.65
2, 1, 2017-01-04, 283.24
2, 0, 2017-01-05, 74.23
我可以运行basetable SELECT
瞬间,但是当我加入SUM
功能和INNER JOIN mail_data
到派生表,该查询会一直运行到服务器超时(几个小时)。
mail_data
表约6亿行,其他表相对较小。
我在mail_data.PurchaseDate
上添加了一个索引,而EXPLAIN
表明该索引正在查询中使用。我还增加了缓冲区大小并将数据移至SSD。
这可能是服务器或数据库优化的问题,还是我的查询写入不正确?
谢谢!
感谢您的回答!不幸的是,查询仍然在一夜之间完成,并且还没有停止。我能做更多来优化查询吗?我觉得它不应该在SSD上花费这么长时间,并且CPU使用率只有13%。 –
@GraysonWyker。 。 。我添加了一个'JOIN'条件,缺少这个条件可能解释性能问题。 –
这工作,并把它带到2小时,谢谢! –