我有以下大型查询,它基本上使用日期表上的左连接按日期对事务进行分组。
SELECT DATE_FORMAT(dim.date_value, '%b %e') AS DATE,
IFNULL(ROUND(SUM(s.amount), 2), 0) AS revenue
FROM dim_date AS dim
LEFT JOIN transactions AS s
ON dim.date_value = DATE(s.date) AND s.user_id = 2807 AND s.status = 'COMPLETED'
WHERE dim.date_value > CURDATE() - INTERVAL 30 DAY
AND dim.date_value < CURDATE() + INTERVAL 1 DAY
GROUP BY dim.year, dim.date_value
ORDER BY dim.date_value
由于我的交易表非常大,这个查询速度慢得多,我想弄清楚如何优化呢?
更新
解释上述查询的陈述:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE dim ALL \N \N \N \N 2907 Using where; Using temporary; Using filesort
1 SIMPLE s ALL \N \N \N \N 118871
答案 0 :(得分:1)
创建两个索引:
CREATE INDEX dim_date_value ON dim_date( date_value );
CREATE INDEX tran_user_id ON transactions( `user_id` );
后者是必须的,前者不如后者重要,但也可以提供帮助。
答案 1 :(得分:0)
可能的罪魁祸首是:
ON dim.date_value = DATE(s.date)
具体来说,就是这个功能。如果您的任何事务元素都没有在日期字段中包含时间元素,则可以在不使用该函数的情况下加入。如果他们这样做,可能有必要在您的交易表中添加仅限日期字段,并在其上添加索引。