查询场景为工单查询某步骤的处理人、处理时间等信息。
工单历史记录表中存在工单操作记录存在同步骤,多人员处理情况,在提取最后处理人时,查询逻辑使用操作时间最大,
数据记录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;
优化思路,简化集合