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

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


前言

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


一、java8 流是什么

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

二、本次优化涉及操作

1.流去重

代码如下(示例):

java 复制代码
(操作对象).distinct().collect(Collectors.toList());

2.流分批

代码如下(示例):

java 复制代码
		//一批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树工具类建树

代码如下(示例):

java 复制代码
		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.全部代码

代码如下(示例):

java 复制代码
		//实体类


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;

}
java 复制代码
//整体函数
	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,欢迎讨论,勿喷,怕怕

相关推荐
秋939 分钟前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
huangdong_2 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育2 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
JohnnyDeng942 小时前
【鸿蒙】ArkUI 列表性能优化:LazyForEach 与组件复用深度解析
性能优化·harmonyos·arkts·鸿蒙·arkui
chase_my_dream2 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
snow@li2 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
云烟成雨TD2 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework2 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
天佑木枫3 小时前
15天Python入门系列 · 序
开发语言·python