有人可以帮我优化以下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秒才能执行。没有GROUP BY下降到10秒。我用DISTINCT测试但是我没有改善时间。有什么想法吗?
答案 0 :(得分:0)
尝试此查询
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)
答案 1 :(得分:0)
这是您的查询:
ATT,A,ATTT
看起来很合理。因此,在彻底重写之前,您是否拥有以下索引:1,2,3
,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)
时,MySQL非常糟糕 - tab3(idtask, name)
的10秒表明了很多数据。有什么办法可以减少数据的大小吗?桌子的大小有多大?结果集有多大?
如果您有大量数据,那么20秒可能并非不合理。
答案 2 :(得分:0)
看起来你是按字符串分组,所以你需要在name
列上添加索引。加入MySQL表时必须始终使用索引