〇、问题
今天群里有人问SELECT *FROM tableWHERE id IN(11,2,3,44,...)
在in里面有大量数据4000+,有什么 好的处理方式吗?
我的优化方案的总体思路是把in转换成表连接
仅仅以MySQL和Java举例,其他数据库和开发语言也有类似的实现
1、目标
总体来说大概就是弄出来sql要这样SELECT a.*FROM table aINNER JOIN (
SELECT 11 id
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 44
#其他的省略) t ON a.id = t.id
2、代码
mybatis代码为INNER JOIN (
<foreach collection="list" item="item" index="index" separator="UNION ALL" >
SELECT #{item} id
</foreach>)t ON a.id = t.id
入参为parameterType="java.util.List"
这样就可以把in转换成mysql的表连接。
3、参数分裂
如果有sql过长的错误。就减少一次传入的list中id个数。
例如1000个一组查一次。然后在java中合并list
方法是java.util.List的boolean addAll(Collection<? extends E> c);
其他类似多参数in行构造器查询时。也可以使用类似方法优化。该方法可以使用到in的关系键是多列的情况
科学探索频道,专天文航天,UFO探索,生物·自然,历史考古,人文地理,生活百科,华夏地理,时尚家居,别墅家居,别墅装修,花园生活花园设计,小户家居,书房装修,国际足球,F1赛车,欧冠,英超,意甲,西甲,德甲,篮球,NBA,赛车,网球,香车美女,ATP,WTA,体育新闻,曼联,阿森纳,欧冠直播,英超,意甲直播,西甲,德甲,篮球,比分直播,AC米兰