〇、问题
今天ocp群里有人问
SELECT *
FROM table
WHERE id IN(11,2,3,44,...)
在in里面有大量数据4000+,有什么 好的处理方式吗?
我的优化方案的总体思路是把in转换成表连接,其中in中多值转换成一列的结果集,类似临时表功能
仅仅以MySQL和Java举例,其他数据库和开发语言也有类似的实现
1、目标
总体来说大概就是弄出来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
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.Listboolean addAll(Collection<? extends E> c);
其他类似多参数in行构造器查询时。也可以使用类似方法优化。该方法可以使用到in的关系键是多列的情况
in多值优化

相关文章:

  • 2022-12-23
  • 2021-11-09
  • 2021-07-30
  • 2022-12-23
  • 2022-12-23
  • 2022-01-20
  • 2021-12-11
  • 2021-09-29
猜你喜欢
  • 2021-11-30
  • 2022-12-23
  • 2022-02-17
  • 2022-12-23
  • 2022-12-23
  • 2021-09-25
  • 2021-12-17
相关资源
相似解决方案