一次SQL优化的尝试

今天解决一个线上的问题,模糊查询卡死,速度特别慢。
通过一系列排查发现sql语句大概长这样(伪代码)。

select * from a 
where a.bm_id in (123,456,789,.......)/*省略号表示多个字符串*/
and a.bm_mc like '%测试%'
order by xxx;

where in 里面的内容是通过另一条sql查出来的,当时的结果是一个List,然后在代码中拼接逗号,再塞到in的括号里面去。
如果结果比较少的情况下还好,有的情况下in里面拼接了700多个字符串。
还有循环遍历list,还在循环中拼接String,我真是无力吐槽。
本来模糊查询还有排序就慢了,这样直接卡死,一分钟都没跑完。

第一次尝试,不查两次,直接把那条sql塞到in里面去,也就是采取子查询。

select * from a 
where a.bm_id in (select bm_id from b)
and a.bm_mc like '%测试%'
order by xxx;

终于可以看到结果了,大概用了5.5s出结果了。

第二次尝试,据说exists比in效率高。
试了一下,6s,没什么变化。

第三次尝试,用连接查询替代子查询。

select * from a 
right join (select bm_id from b) bb on a.bm_id = bb.bm_id
where a.bm_mc like '%测试%'
order by xxx;

查询时间2.2s,和原来比简直是天壤之别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值