大数据量模糊查询优化(流去重,流分批,建树操作)

大数据量模糊查询优化(流去重,流分批,建树操作)

  • 前言
  • 一、java8 流是什么
  • 二、本次优化涉及操作
    • 1.流去重
    • 2.流分批
    • 3.hutool树工具类建树
    • 4.全部代码
  • 总结


前言

有时候会进行大数据量查询后的建树操作,如果直接使用sql语句会大大延缓业务效率,因此需要优化,本文章介绍了使用java8流操作以及hutool树工具栏的建树操作。


一、java8 流是什么

流是支持各种方法的对象序列(一系列对象,列入:LIst对象)

二、本次优化涉及操作

1.流去重

代码如下(示例):

(操作对象).distinct().collect(Collectors.toList());

2.流分批

代码如下(示例):

		//一批500条int batchSize = 500;//赋值List<String> finalSysDistrictParentCodeStringList = sysDistrictParentCodeStringList;//对finalSysDistrictParentCodeStringList进行分批处理List<List<String>> batches = IntStream.range(0, (finalSysDistrictParentCodeStringList.size() + batchSize - 1) / batchSize).mapToObj(i -> finalSysDistrictParentCodeStringList.subList(i * batchSize, Math.min(finalSysDistrictParentCodeStringList.size(), (i + 1) * batchSize))).collect(Collectors.toList());

3.hutool树工具类建树

代码如下(示例):

		TreeNodeConfig treeNodeConfig = new TreeNodeConfig();//设置id字段treeNodeConfig.setIdKey("code");//设置父级id字段treeNodeConfig.setParentIdKey("parentCode");List<Tree<String>> trees = TreeUtil.build(result, "0", treeNodeConfig, ((object, treeNode) -> {//对树节点进行id赋值treeNode.setId(object.getCode());//id//对树节点进行父级id赋值treeNode.setParentId(object.getParentCode());//父id//对树节点进行名称赋值treeNode.putExtra("name", object.getName());//对树节点进行层级赋值treeNode.putExtra("level", object.getLevels());}));log.info("建树后:{}",trees.size());

4.全部代码

代码如下(示例):

		//实体类import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;import java.util.Map;
import java.util.Set;/*** 全国区域Demo*/
@Data
@ApiModel(value = "全国区域")
public class SysDistrictDemo extends BasePageQuery {/*** 编码*/private String code;/*** 名称*/private String name;/*** 父级编号*/private String parentCode;/*** 层级*/private Integer levels;}
//整体函数public R getTreeByLikeInfoDemo(SysDistrictDemo sysDistrictDemo) {QueryWrapper<SysDistrict> wrapper = new QueryWrapper<>();wrapper.like("name",sysDistrictDemo.getName());List<String> sysDistrictParentCodeStringList = "根据条件模糊查询";log.info("去重前:{}",sysDistrictParentCodeStringList.size());//至此 取得所有数据 去重List<SysDistrictTree> result = new ArrayList<>();sysDistrictParentCodeStringList = sysDistrictParentCodeStringList.stream().distinct().collect(Collectors.toList());log.info("去重后:{}",sysDistrictParentCodeStringList.size());int batchSize = 500;List<String> finalSysDistrictParentCodeStringList = sysDistrictParentCodeStringList;List<List<String>> batches = IntStream.range(0, (finalSysDistrictParentCodeStringList.size() + batchSize - 1) / batchSize).mapToObj(i -> finalSysDistrictParentCodeStringList.subList(i * batchSize, Math.min(finalSysDistrictParentCodeStringList.size(), (i + 1) * batchSize))).collect(Collectors.toList());batches.forEach(codes->{result = "使用sql中in的查询操作,例如:select a.id from a in #{codes}"});log.info("取值后:{}",result.size());TreeNodeConfig treeNodeConfig = new TreeNodeConfig();//设置id字段treeNodeConfig.setIdKey("code");//设置父级id字段treeNodeConfig.setParentIdKey("parentCode");List<Tree<String>> trees = TreeUtil.build(result, "0", treeNodeConfig, ((object, treeNode) -> {//对树节点进行id赋值treeNode.setId(object.getCode());//id//对树节点进行父级id赋值treeNode.setParentId(object.getParentCode());//父id//对树节点进行名称赋值treeNode.putExtra("name", object.getName());//对树节点进行层级赋值treeNode.putExtra("level", object.getLevels());}));log.info("建树后:{}",trees.size());return R.ok(trees);}

总结

自此完成了优化,本人是50s优化至7s,欢迎讨论,勿喷,怕怕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S之存储卷

K8S之存储卷 一、emptyDir emptyDir&#xff1a;可实现Pod中的容器之间共享目录数据&#xff0c;但emptyDir存储卷没有持久化数据的能力&#xff0c;存储卷会随着Pod生命周期结束而一起删除二、hostPath hostPath&#xff1a;将Node节点上的目录/文件挂载到Pod容器的指定目录…

TypeScript 关于对【泛型】的定义使用解读

目录 概念导读泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类总结&#xff1a; 概念导读 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型…

Oracle切割字符串的方法,SQL语句完成。

Oracle用正则的方式循环切割字符串 需求&#xff1a;有一个这样子的 Str “‘CNJ-520-180500000001|CNJ-520-181200000001|CNJ-520-190300000001|CNJ-520-190100000001|CNJ-520-181200000002’” &#xff0c;然后我需要拿到每一个单号&#xff0c;每一个单号都要走一遍固定的…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境&#xff1a;沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界&#xff01;在这个博客中&#xff0c;我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者&#xff0c;MongoDB都将为您带来一场令人心动…

如何实现安全上网

l 场景描述 政府、军工、科研等涉密单位或企业往往要比其他组织更早接触高精尖的技术与产品&#xff0c;相对应的数据保密性要求更高。常规的内外网物理隔离手段&#xff0c;已经满足不了这些涉密单位的保密需求&#xff0c;发展到现在&#xff0c;需求已经演变成既要保证网络…

记一次Kafka重复消费解决过程

起因&#xff1a;车联网项目开发&#xff0c;车辆发生故障需要给三个系统推送消息&#xff0c;故障上报较为频繁&#xff0c;所以为了不阻塞主流程&#xff0c;采用了使用kafka。消费方负责推送并保存推送记录&#xff0c;但在一次压测中发现&#xff0c;实际只发生了10次故障&…

“深入探究JVM内部机制:理解Java虚拟机的工作原理“

标题&#xff1a;深入探究JVM内部机制&#xff1a;理解Java虚拟机的工作原理 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;帮助读者理解JVM的工作原理。我们将介绍JVM的组成部分、类加载过程、内存管理和垃圾回收机制&#xf…

带你了解ChatGPT

目录 什么是ChatGPT 从ChatGPT角度看聊天机器人的历史 聊天机器人的早期历史 ChatGPT的出现 ChatGPT和其他聊天机器人的比较 总结 ChatGPT相比其他聊天机器人的优势在哪里 1. 自然语言处理能力更强 2. 编程能力高&#xff0c;应用领域广泛 3. 可以满足个性化需求 4.…

Golang实现完整聊天室(内附源码)

项目github地址&#xff1a; 由于我们项目的需要&#xff0c;我就研究了一下关于websocket的相关内容&#xff0c;去实现一个聊天室的功能。 经过几天的探索&#xff0c;现在使用Gin框架实现了一个完整的聊天室消息实时通知系统。有什么不完善的地方还请大佬指正。 用到的技术…

使用自己的数据利用pytorch搭建全连接神经网络进行回归预测

使用自己的数据利用pytorch搭建全连接神经网络进行回归预测 1、导入库2、数据准备3、数据拆分4、数据标准化5、数据转换6、模型搭建7、模型训练8、模型预测9、完整代码 1、导入库 引入必要的库&#xff0c;包括PyTorch、Pandas等。 import numpy as np import pandas as pd f…

tp6 RabbitMQ

1、composer 安装 AMQP 扩展 composer require php-amqplib/php-amqplib 2、RabbitMQ 配置 在 config 目录下创建 rabbitmq.php 文件 <?php return [host>,port>5672,user>,password>,vhost>,exchange_name > ,queue_name > ,route_key > ,cons…

中国生产了5.07亿台,库存高达近4亿台?国产手机彻底卖不动了?

统计数据显示今年上半年中国的手机产量达到5.07亿台&#xff0c;国内市场手机出货量仅有1.24亿台&#xff0c;都出现了下滑&#xff0c;那么中国手机的产量比销量多出了3.83亿台&#xff0c;这些手机都成为了库存&#xff1f; 中国手机市场确实不如早年那么辉煌&#xff0c;201…

【FAQ】安防监控视频EasyCVR平台分发的FLV视频流在VLC中无法播放

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

P12-Retentive NetWork-RetNet挑战Transformer

论文地址:https://arxiv.org/abs/2307.08621 目录 Abstract 一.Introduction 二.Retentive Networks 2.1Retention 2.2Gated Multi-Scale Retention 2.3Overall Architecture of Retention Networks 2.4Relation to and Differences from Previous Methods 三.Experime…

Codeforces Round 892 (Div. 2)(VP)

A //b里放最小值&#xff0c;其他值放c。如果最大值最小值&#xff0c;则无解。 void solve() {int n; cin >> n;vi a(n); liter(x, a) cin >> x; sort(all(a));if (a[0] a[n - 1]){print(-1); return;}vi b, c;for (int i 0; i < sz(a); i){if (a[i] a[0])…

小米基于 Flink 的实时计算资源治理实践

摘要&#xff1a;本文整理自小米高级软件工程师张蛟&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 发展现状与规模框架层治理实践平台层治理实践未来规划与展望 点击查看原文视频 & 演讲PPT 一、发展现状与规模 如上图…

【03】基础知识:typescript中的函数

一、typescript 中定义函数的方法 函数声明法 function test1(): string {return 返回类型为string }function test2(): void {console.log(没有返回值的方法) }函数表达式/匿名函数 const test3 function(): number {return 1 }二、typescript 中 函数参数写法 1、typesc…

helm安装harbor + nerdctl 制作push 镜像

参考 文章&#xff1a;Helm部署Harbor_helm harbor_风向决定发型丶的博客-CSDN博客 安装好后使用 nerd containerd对接harbor_containerd 容器 insecure-registries 配置_柠是柠檬的檬的博客-CSDN博客 推送镜像 Containerd 对接私有镜像仓库 Harbor - 知乎 接下来我们来…

麒麟系统相关

创建虚拟机 镜像下载地址 选择合适的镜像&#xff0c;进入引导后注意不要选择默认的第一条&#xff0c;选择第二条进入安装程序。 root密码修改 使用命令 sudo passwd root 开启ssh 配置好网络后发现能ping通&#xff0c;但无法ssh连接&#xff0c;ps -ef | grep ssh 得…

01 qt快速入门

一 qt介绍 1.基本概念 1991年由Qt Company(奇趣)开发的跨平台C++图形用户界面应用程序开发框架,GUI程序和非GUI程序。优点:一套源码在不同的平台通过不同的编译器进行编译,就可以运行到该平台上目标机。面向对象的封装机制来对其接口封装。 GUI —图形用户界面(Graphic…