记录一次查询优化

记录一次查询优化

在写代码过程中,由于开发时间或者人员原因,会经常遇到刚开始开发的功能运行很快,随着数据量增加,查询会越来越慢,就要学会优化代码,这里记录一次优化SQL的过程,先看原先查询:

SELECT t.id,t.orderNo,t.FMaterialID_FNumber,t.FMaterialID_FName,t.num,t.preStartDate,f.flowName,t.dipStatus lineState ,l.lineBodyName,t.lineBodyId2,a.startTime
,t.dipStartDate,t.dipEndDate
FROM `ORDER` t LEFT JOIN FLOW f ON t.flowId = f.id
LEFT JOIN (select max(startTime) startTime,orderId from production GROUP BY orderId)a ON t.id = a.orderId,qb_line_body l
WHERE t.deleteFlag = 0 AND t.preType = 0 AND t.lineBodyId2 = l.id AND t.typeProduce in( 'DIP','SMT&DIP') AND t.dipStatus NOT IN ('完工','结束','待备料');

通过调试,最后定位到了慢的SQL

select max(startTime) startTime,orderId 
from production 
GROUP BY orderId

通过EXPLAIN分析一下

idselect_typetableparttionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEproductionindexindex_orderId,index_groupindex_orderId5471282100.00

执行时间为:
在这里插入图片描述

索引是走了的,但是走的不对,这条SQL是全表扫描,肯定是很慢的,因为需要查找到最新的添加时间,上面的慢SQL是查找最新的时间,然后根据工单id分组,查询很慢,优化的思想是,既然id最大的,就是最新的插入时间(因为业务逻辑是我写的),就先查询出来最新的id然后根据工单id进行分组,然后将查询出来的数据关联自身,优化后的SQL是这样的

select p.startTime,p.orderId 
from production p,(select max(id) id  
	from production 
	GROUP BY orderId) p2 
where p.id = p2.id

分析一下SQL的执行效率

idselect_typetableparttionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1PRIMARY<derived2>ALL55100.00Using where
1PRIMARYpeq_refPRIMARYPRIMARY4p2.id110.00Using where
2DERIVEDproductionrangeindex_orderId,index_groupindex_orderId555100.00Using index for group-by

可以看到,rows变少了,速度也快了很多
在这里插入图片描述
到这里,优化完成,是一个很小的优化,结合数据表设计业务逻辑,优化很简单,其实最重要的是在Java代码里面有循环,当然,循环的影响不是很大,一次查库十毫秒,循环一百次才一秒还能接受,毕竟表头不需要太多,也就几百条,主要是查询表头的数据的地方慢了,后续的SQL肯定不是这样的,肯定要重写把嵌套循环去掉的,直接把报表详情一条SQL查出来,这样才能最大限度优化效率。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeiSir_PC

您的三联和鼓励是我创作的最大动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值