有人能帮我优化下面的MySQL查询吗?
SELECT SUM(ROUND(rp.distance,2)), t.name, MONTH(tr.assigned)
FROM tab1 tr
JOIN tab2 rp ON rp.robot=tr.robot
JOIN tab3 t ON t.idTask=tr.idTask
GROUP BY t.name, MONTH(tr.assigned)
查询需要20秒才能执行。在没有组的情况下下降到10秒。我用DISTINCT进行了测试,但是我没能提高时间。有什么想法吗?
发布于 2015-07-02 19:33:21
尝试此查询
SELECT SUM(distance), t.name, MONTH(tr.assigned)
FROM tab1 tr
JOIN tab2 rp ON rp.robot=tr.robot
JOIN (select ROUND(rp.distance,2) as distance, a.idTask from tab3 a) t ON t.idTask=tr.idTask
GROUP BY t.name, MONTH(tr.assigned)
发布于 2015-07-02 19:36:50
这是您的查询:
SELECT SUM(ROUND(rp.distance, 2)), t.name, MONTH(tr.assigned)
FROM tab1 tr JOIN
tab2 rp
ON rp.robot = tr.robot JOIN
tab3 t
ON t.idTask = tr.idTask
GROUP BY t.name, MONTH(tr.assigned);
这看起来很合理。因此,在彻底重写它之前,您是否拥有以下索引:tab1(robot, idtask, assigned)
、tbl2(robot)
和tab3(idtask, name)
。
接下来,也许数据量太大了。当涉及到group by
时,MySQL是相当糟糕的--对于group by
来说,10秒意味着有很多数据。有没有什么方法可以减少数据的大小?桌子的大小是多少?结果集有多大?
如果你有大量的数据,那么20秒可能不是不合理的。
发布于 2015-07-02 19:39:26
看起来您是按字符串分组的,所以您需要在name
列上添加索引。连接MySQL表时必须始终使用索引
https://stackoverflow.com/questions/31183382
复制相似问题