今天解决一个线上的问题,模糊查询卡死,速度特别慢。
通过一系列排查发现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,和原来比简直是天壤之别。