场景是这样的:使用in查询数据的时候,in的数量越多,效率越低,所以一个优化的思路是,缩小in查询的数量,用多线程的方式查询缩小数量后in的sql,并行查询。

直接上代码:

public List<UserOrgVO> getCscpOrgInfoByUserId(List<Integer> userIds) {//List<UserOrgVO> list = innerWorkFlowRepository.batchGetCscpOrgInfoByUserId(userIds);List<UserOrgVO> list = getInListThread(userIds);return list;}private List<UserOrgVO> getInListThread(List<Integer> userIds){List<UserOrgVO> resultList = Collections.synchronizedList(new ArrayList<>());List<CompletableFuture> tasks = new ArrayList<>();int threshold = 3; // 每个线程最大条数int threadNum = userIds.size() / threshold;  // 线程个数int lastSize = userIds.size() % threshold; // 最后一个线程的数据条数//多线程for (int i = 0; i <= threadNum; i++) {int start = i * threshold;int end = 0;if (i != threadNum) {end = (i + 1) * threshold;} else {end = lastSize == 0 ? start : (lastSize + start);}int finalEnd = end;CompletableFuture<Void> task = CompletableFuture.runAsync(() -> {List<Integer> tempMsIdList = new ArrayList<>();for (int j = start; j < finalEnd; j++) {tempMsIdList.add(userIds.get(j));}List<UserOrgVO> temps = new ArrayList<>();if(!org.springframework.util.CollectionUtils.isEmpty(tempMsIdList)){//查询SQLSystem.out.println(Thread.currentThread().getId() + "in的数量:" + tempMsIdList.size());temps =  innerWorkFlowRepository.batchGetCscpOrgInfoByUserId(tempMsIdList);}if (!org.springframework.util.CollectionUtils.isEmpty(temps)) {resultList.addAll(temps);}});tasks.add(task);}CompletableFuture.allOf(tasks.toArray((new CompletableFuture[] {}))).join();return resultList;}

其中,只需配置private的方法中的最大线程数参数threshold即可,按照实际需求配置,此时我配置的参数是3,即每次in的数量是3个,测试userIds的数量是8个。

打印的结果如下(sql日志忽略):

使用FeatureTask多线程优化in,提高查询速度相关推荐

  1. 利用SQL索引提高查询速度

    1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构. 索引的使用要恰到好处,其使用原则如下: 在经常进行连接 ...

  2. php 增加mysql 索引,【PHP】为什么 MySQL 添加索引后就可以提高查询速度

    遇到这种问题,你就要高度集中,保持空杯心态,脑海里要有以下三个问题 为什么添加索引会提高查询速度 索引提高了查询速度对增删改有影响 索引常用的算法原理分析B树和B+树 下面来详细介绍介绍 为什么添加索 ...

  3. lambda 查询大量数据速度很慢_处理百万级以上的数据提高查询速度的方法

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...

  4. lambda 查询大量数据速度很慢_处理百万级以上的数据提高查询速度的方法:

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...

  5. redis提高查询速度_面试小点-MySQL 的两种索引方法如何提高查询速度

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引方法 Mysql的索引方法有两种,BTERR和HASH. 散列表(Hash Table)和B+Tre ...

  6. mysql索引级别快慢_面试小点-MySQL 的两种索引方法如何提高查询速度

    MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度. 索引方法 Mysql 的索引方法有两种,BTERR 和 HASH. 散列表(Hash Tabl ...

  7. Oracle物化视图优化多表查询速度

    近期项目中遇到有关报表查询sql速度过慢的问题,由于sql是多个表相关联的查询结果,并且数据量过大,所以导致查询速度过慢.为此,采用物化视图来提高查询速度. 1.物化视图概述 物化视图是包括一个查询结 ...

  8. 使用索引为什么能提高查询速度?

    作者:big_foot cnblogs.com/Berryxiong/p/6249427.html 关于资源视频下载的说明 常用设计模式完整系列篇 [强化编程功底]算法文摘 为什么能够提高查询速度? ...

  9. 处理百万级以上的数据提高查询速度的方法

    1.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索 ...

  10. MySQL 异步查询提高查询速度

    本文解决什么问题 什么是 MySQL 异步查询 MySQL 异步查询的优缺点 一个例子 异步查询功能 MySQLi 扩展提供了异步查询功能,需要使用 mysqlnd ( MySQL Native Dr ...

最新文章

  1. 观点:BCH的SLP-token正进入爆发期,未来或成为BCH最大应用场景
  2. u2net encode
  3. SQL Server 2008 复习(一)
  4. Linux 关于查看 cpu 的命令
  5. web开发软件,8个优秀的CSS实践,附面试题
  6. 谷歌翻译无法连接网络_window10无法连接网络
  7. excel保存快捷键_干货 | 快速提高工作效率的电脑快捷键!
  8. ApacheCN 交流社区一周热点 2019.4 wk1
  9. 《Python入门到精通》Python基础语法
  10. 测网速还能拿奖励?测速 App 的新玩法
  11. composer.install
  12. JavaWeb框架基础
  13. 如何查看自己的qq邮箱服务器地址,怎么看自己设置的qq邮箱帐号
  14. svn提示没有设置冲突_SVN冲突解决方法大全
  15. 八核处理器真的比四核性能强悍吗?
  16. Python - matplotlib - ROC曲线(Receiver Operating Characteristic curve)
  17. 微信小程序 - 在自定义组件中请求后端 API 数据接口(引入该组件的页面触发)组件在哪个生命周期钩子函数中请求接口数据呢?
  18. 如何提高一个网站的排名?
  19. 搜狗搜索图片查看器调用帮助
  20. 计算机逻辑函数,逻辑函数

热门文章

  1. 搭了我半年顺风车的同事,把我拉黑了:和任何人走太近,都是一场灾难
  2. 我去,脸皮厚啊,你竟然使用==比较浮点数?
  3. ppt_第十章_DNA非卷积视觉技术
  4. 老板让你用Excel制作仪表盘?你这样做,几分钟就能搞定了
  5. 会计学原理学习笔记——第三章——账户与复式记账(3.4生产准备业务核算——材料采购业务核算)
  6. 无人驾驶实战第一课--七月在线
  7. 解决“此图片来自微信公众平台 未经允许不可引用”的方法
  8. (10.1.4) Material Design设计规范
  9. c# asp.net mvc使用斑马GK888t打印机打印标签
  10. 《网络安全审查办法》将影响我们什么?