如何优化依赖于日期值的JOIN查询?

时间:2014-01-01 14:18:42

标签: mysql sql query-optimization

我有以下大型查询,它基本上使用日期表上的左连接按日期对事务进行分组。

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  

Schema for dim_date table

Schema for transactions table

2 个答案:

答案 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)

具体来说,就是这个功能。如果您的任何事务元素都没有在日期字段中包含时间元素,则可以在不使用该函数的情况下加入。如果他们这样做,可能有必要在您的交易表中添加仅限日期字段,并在其上添加索引。