查询场景为工单查询某步骤的处理人、处理时间等信息。
工单历史记录表中存在工单操作记录存在同步骤,多人员处理情况,在提取最后处理人时,查询逻辑使用操作时间最大,
数据记录id为自增序列,则使用根据工单,步骤,动作分组取最大值方式进行查找。
前期由于数据量小使用 in 取最大值的方式查询,后期数据量加大之后查询时间 >30s
aa : 8k+
bb :5w+
dd:2w+
ep >
SELECT a.id,b.ee,b.ff,c.name
FROM aa a
LEFT JOIN bb b on b.d_id = a.id
and b.ID in (
select max(t1.ID) from bb t1 where 1=1 and 2=2 and 3=3 GROUP BY t1.d_id
)
LEFT JOIN cc c on c.id=b.u
order by a.id;
后期调整查询关联方式使用在left join 中使用 查询代替原表的方式,查询时间 <0.5s rows 1W+
使用MySQL Explain 查看执行计划
ep>
SELECT a.id,b.ee,b.ff,c.name
FROM aa a
LEFT JOIN (
select t2.mid,t2.d_id,c.ee,c.ff,t.u
from (
select max(t1.ID) mid,t1.d_id
from bb t1
where 1=1 and 2=2 and 3=3
GROUP BY t1.d_id )t2
left JOIN bb t on t.ID = t2.mid
)b on b.d_id = a.id
LEFT JOIN cc c on c.id=t3.u
order by a.id;
优化思路,简化集合
本文讨论了在工单历史记录表中查询特定步骤的最后处理人和处理时间的优化过程。从最初的in取最大值方式导致查询时间过长,到通过调整查询关联方式,使用子查询替代原表,显著提升查询效率。
174万+

被折叠的 条评论
为什么被折叠?



