〇、问题
今天ocp群里有人问
SELECT *
FROM table
WHERE id IN(11,2,3,44,...)
在in里面有大量数据4000+,有什么 好的处理方式吗?
个人优化方案的整体思路是把in转换成表链接,其中in中多值转换成一列的结果集,相似临时表功能
仅仅以MySQL和Java举例,其余数据库和开发语言也有相似的实现
一、目标
整体来讲大概就是弄出来sql要这样
SELECT a.*
FROM table a
INNER JOIN (
SELECT 11 id
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 44
#其余的省略
) t ON a.id = t.id
二、代码
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的表链接。
三、参数分裂
若是有sql过长的错误。就减小一次传入的list中id个数。
例如1000个一组查一次。而后在java中合并list
方法是java.util.List
的boolean addAll(Collection<? extends E> c);
其余相似多参数in行构造器查询时。也能够使用相似方法优化。该方法能够使用到in的关系键是多列的状况
java