大數據量模糊查詢優化(流去重,流分批,建樹操作)

大數據量模糊查詢優化(流去重,流分批,建樹操作)

  • 前言
  • 一、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.pswp.cn/news/38028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38028.shtml
英文地址,請注明出處:http://en.pswp.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…