java小白针对大数据多表联查的一些小思路,帮助新手学习

假设我的member_user里面有352599条数据,gp_project里面有1211974条数据

SELECT gp.*, mu.linkmanName , mu.linkmanPhone, mu.legalPersonName, mu.legalPersonPhone, mu.address, mu.registerArea FROM gp_project gp LEFT JOIN member_user mu ON mu.supplierId = gp.supplier_id WHERE DATE(gp.publicity_time) >= '2024-04-03' AND DATE(gp.publicity_time) <= '2024-04-07' and mu.deleted = 0

针对这样的数据,我的数据表里面数据太多,导致了查询需要512秒的时间,而且这仅仅是两个表的关联,之后还需要关联四五个表组成一条查询语句,如果仅在mysql里面查,未免有些太为难服务器了。

因为平常批量数据用的sql里面的in语法比较多,所以尝试了一下用关联字段in数据的情况,突然发现,这样还挺快,主要是因为关联字段是索引,所以比较快,通过单表查出数据,然后将关键字段提取出来,in到另一个表里面快速查询,最后拼接字段,来实现数据的查询结果。

另外因为涉及到多个循环,如果仅仅遵循 循环的外小内大原则,这样未免要写多个循环,降低了程序的运行效率多个O(n^2)的程序跑的,这样未免太致命了。改用map的key和value对照关系这样通过一个循环+map的方式降低时间复杂度为O(1) ,这样就会快很多

其实我在网上找了很多办法都挺无力的,排除掉物理升级和缓存这两个(因为没钱和数据每天都在更新),索引优化,分页查询,改数据类型,这些能做到的都是微不足道。还希望有大佬可以给出一些新的思路和想法,万分感谢,本贴的丑陋代码仅作抛砖引玉。

下面是操作案例(取自部分的项目代码)

mybaits部分(单个案例)


<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  <mapper namespace="com.xyjq.mapper.db1.LoginMemberUserDao">  <!--根据供应商id判断是否为注册用户 -->  <select id="isRegisterSupplier" resultType="com.xyjq.entity.db1.LoginMemberUserEntity">  SELECT supplierId,createTime FROM `login_member_user` WHERE supplierId in  <foreach collection="supplierIdList" item="supplierId" open="(" separator="," close=")">  #{supplierId}  </foreach>  </select>  </mapper>

业务层部分

List<GpProjectEntity> list = baseDao.queryList(params);  Set<Integer> supplierIdList =  list.stream()  .map(GpProjectEntity::getSupplierId)  .filter(Objects::nonNull)  .collect(Collectors.toSet());  
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMddHHmmss");  
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
// 以下遍历中防止嵌套for循环O(n^2),使用map对象存储降低时间复杂度为O(1)  
Map<String, MemberUserEntity> memberUserInfoMap = new HashMap<>();  
memberUserDao.getMemberUserInfo(supplierIdList).forEach(memberUser -> memberUserInfoMap.put(memberUser.getSupplierId().toString(), memberUser));  Map<String, SupplierBussinessInformationEntity> supplierBusinessInfoMap = new HashMap<>();  
supplierBussinessInformationDao.getSupplierBusinessInfo(supplierIdList).forEach(supplierBusinessInfo -> supplierBusinessInfoMap.put(supplierBusinessInfo.getSupplierId().toString(), supplierBusinessInfo));  Map<String, LoginMemberUserEntity> loginMemberUserMap = new HashMap<>();  
loginMemberUserDao.isRegisterSupplier(supplierIdList).forEach(loginMemberUser -> loginMemberUserMap.put(loginMemberUser.getSupplierId().toString(), loginMemberUser));  Map<String, String> financingNeedsMap = new HashMap<>();  
// 根据搜索结果,如果key一样就拼接value  
financingNeedsDao.getCompFinancingNeeds(supplierIdList).forEach(financingNeeds -> {  String key = financingNeeds.getSupplierId();  String value = FinancingStatus.getDescriptionByCode(financingNeeds.getFinancingProgress()) + "(" + financingNeeds.getCreateTime() + ")";  financingNeedsMap.merge(key, value, (oldValue, newValue) -> oldValue + ", " + newValue);  
});  for (GpProjectEntity project : list) {  if (project.getAgName() != null && !project.getAgName().isEmpty()) {  project.setProjectNameMergeAgBid(project.getAgName());  } else if (project.getJatTpProName() != null && !project.getJatTpProName().isEmpty()) {  project.setProjectNameMergeAgBid(project.getJatTpProName());  }  if (project.getAgTotalMoney() != null) {  project.setProjectMoneyMergeAgBid(project.getAgTotalMoney());  } else {  project.setProjectMoneyMergeAgBid(project.getWinPriceRevised());  }  // 设置项目的日期  if (project.getAgSignDate() != null) {  Date date = null;  try {  date = inputFormat.parse(project.getAgSignDate());  } catch (ParseException e) {  throw new RuntimeException(e);  }  project.setProjectDateMergeAgBid(dateFormat.format(date));  } else {  project.setProjectDateMergeAgBid( dateFormat.format(project.getJatWinTime()) );  }  String supplierId = project.getSupplierId().toString();  // 设置供应商信息  MemberUserEntity memberUser = memberUserInfoMap.get(supplierId);  if (memberUser != null) {  project.setProjectLinkManName(memberUser.getLinkmanName());  project.setProjectLinkManPhone(memberUser.getLinkmanPhone());  project.setProjectLegalPersonName(memberUser.getLegalPersonName());  project.setProjectLegalPersonPhone(memberUser.getLegaPersonPhone());  project.setProjectAddress(memberUser.getAddress());  project.setProjectRegisterArea(memberUser.getRegisterArea());  }  // 设置工商信息省市区  SupplierBussinessInformationEntity supplierBussinessInformation = supplierBusinessInfoMap.get(supplierId);  if (supplierBussinessInformation != null) {  project.setProjectProvince(supplierBussinessInformation.getProvince());  project.setProjectCity(supplierBussinessInformation.getCity());  project.setProjectDistrict(supplierBussinessInformation.getDistrict());  }  // 设置是否是注册用户  LoginMemberUserEntity loginMemberUser = loginMemberUserMap.get(supplierId);  if (loginMemberUser != null) {  project.setProjectIsRegisterSupplier("已注册(" + dateFormat.format(loginMemberUser.getCreateTime()) + ")");  }  // 设置融资历史记录  String financingNeeds = financingNeedsMap.get(supplierId);  if (financingNeeds != null) {  project.setProjectFinancingNeeds(financingNeeds);  }  
}

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

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

相关文章

通过“微软蓝屏”事件对网络安全的思考

近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全技术公司“众击”提供的一个带有“缺陷”的软件更新&…

C++在高性能计算与游戏开发中的应用

在追求极致性能和用户体验的今天&#xff0c;C凭借其高效的执行效率和强大的控制能力&#xff0c;在高性能计算&#xff08;HPC&#xff09;和游戏开发领域大放异彩。无论是处理大规模数据集的并行计算&#xff0c;还是构建复杂、逼真的游戏世界&#xff0c;C都展现出了无可比拟…

04 HTML CSS JavaScript

文章目录 HTML1、HTML介绍2、快速入门3、基础标签4、图片、音频、视频标签5、超链接标签6、列表标签7、表格标签8、布局标签9、 表单标签 CSS1、 概述2、 css 导入方式3、 css 选择器4、 css 属性 JavaScript1、JavaScript简介2、JavaScript引入方式3、JavaScript基础语法4、Ja…

【C++刷题】优选算法——分治

颜色分类 void sortColors(vector<int>& nums) {int left -1, right nums.size();for (int i 0; i < right;) {if (nums[i] 0) {swap(nums[left], nums[i]);} else if (nums[i] 2) {swap(nums[--right], nums[i]);} else {i;}} }排序数组 // 快速排序 void…

Potree在web端显示大型点云模型文件

一、克隆项目代码&#xff08;准备好上网工具&#xff0c;得先有node.js npm 环境&#xff09; git clone https://github.com/potree/potree.git二、依赖安装&#xff08;换淘宝镜像能快一些&#xff09; cd potree npm install三、运行 npm start四、使用样例 打开浏览器…

44、PHP 实现数据流中的中位数(含源码)

题目&#xff1a; PHP 实现数据流中的中位数 描述&#xff1a; 如何得到一个数据流中的中位数&#xff1f; 如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。 如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之…

【Spring】SpringRetry重试机制和Spring异步任务发送操作结合应用场景实操,通俗易懂

平时调用一些第三方接口或者内部接口&#xff0c;可能出现处理异常或者超时或者意外因素&#xff0c;我们可以使用重试机制来为用户提高体验。 1.引用依赖 <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</a…

【Qt】文字换行

目录 Qt换行方式一方法二 参考文章 在Qt控件中经常遇到文字超出文本框&#xff0c;因此介绍几种换行方式 Qt换行 方式一 QLabel 设置setWordWrap(true);实现换行。但此方法对于多语言文本不太友好&#xff0c;可以在超出文本框时添加省略符&#xff0c;方法如下 //要显示的超…

单片机学习(18)--红外遥控器

红外遥控器 17.1红外遥控的基础知识1.红外遥控简介2.硬件电路3.基本发送和接收4.NEC编码5.遥控器键码6.51单片机的外部中断7.外部中断寄存器 17.2红外遥控的程序代码1.红外遥控&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09;…

vue 实战 tab标签页+el-card+流式布局+异步接口调用

<template><div><!-- 布局按钮 --><el-button click"dialogVisible true">布局配置查看</el-button><!-- 布局配置对话框 --><el-dialog :visible.sync"dialogVisible" title"布局配置查看" width"…

Invalid bound statement (not found)

Invalid bound statement (not found) 首先申明的是这个错误一般是使用mybatis方法没有找到或者参数不匹配等原因造成的&#xff01; 原本项目是使用eclipse运行&#xff0c;导入到idea之后&#xff0c;项目启动就报错 …Invalid bound statement (not found)… 解决办法&#…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性&#xff0c;可以从以下几个方面着手&#xff1a; 遵守网站的使用条款和服务协议&#xff1a;在爬取数据之前&#xff0c;仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取&#xff0c;哪些不可以。 例如&…

中电金信:AI数据服务

01 方案简介 AI数据服务解决方案为泛娱乐、电子商务、交通出行等行业提供数据处理、数据分析、AI模型训练等服务&#xff0c;通过自主研发的IDSC自动化数据服务平台与客户业务流程无缝衔接&#xff0c;实现超低延时的实时数据处理支持。 02 应用场景 智能医疗&#xff1a; 通…

深入浅出mediasoup—通信框架

libuv 是一个跨平台的异步事件驱动库&#xff0c;用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架&#xff0c;具有单线程、事件驱动和异步的典型特征&#xff0c;是构建高性能 WebRTC 流媒体服务器的重要基础…

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式&#xff0c;设计模式就好比是一种固定代码套路类似于棋谱&#xff0c;是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是&#xff0c;在有…

升级python版本

参考 https://blog.51cto.com/u_15579956/10397535 python3 main.py

聚焦保险行业客户经营现状,概述神策数据 CJO 解决方案

触点红利时代&#xff0c;企业的经营需求从「深度的用户行为分析」转变为「个性化、全渠道一致的客户体验」。客户旅程编排&#xff08;Customer Journey Orchestration&#xff0c;简称 CJO&#xff09;从体验出发&#xff0c;关注客户需求、感受和满意度&#xff0c;能够帮助…

HarmonyOS Next系列之地图组件(Map Kit)使用(九)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

SpringBoot(事务管理,异步任务,任务调度,整合Mail)

spring自身就集成了许多中间件&#xff0c;可以帮助我们进行日常的开发。 一&#xff1a;Spring Boot中的事务管理 spring事务管理有两种方式 编程式&#xff1a; 即&#xff1a;使用AOP中的切点&#xff0c;切面的知识&#xff0c;利用代理模式对事务进行管理&#xff0c;…

【面试】如果一个NPM包部分功能不满足需求,怎么办

在处理第三方npm包不满足特定需求时&#xff0c;有几种推荐的处理方法。直接修改node_modules中的代码虽然可行&#xff0c;但不推荐&#xff0c;因为这些改动在执行npm install或更新包时会丢失。以下是几种推荐的处理方法&#xff1a; 使用Fork 最常见的方式是Fork源代码。…