一个接口查询关联了十几张表,响应速度太慢?怎么办?

Java 里 Hibernate 的多表关联查询优化 在 Java 开发中,Hibernate 是一个广泛使用的对象关系映射(ORM)框架,它简化了数据库操作,使开发者可以通过操作对象来间接操作数据库。然而,在实际应用中,多表关联查询是常见的需求,若处理不当,会导致查询性能低下,影响系统的响应速度和整体性能。本文的目的就是深入探讨 Hibernate 多表关联查询的优化方法,范围涵盖从基本概念到实际应用,从算法原理到代码实现的各个方面,帮助开发者掌握优化技巧,提高查询效率。 阅读详情

不知道开发的同学有没有遇到过类似这样的需求:

  • 相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;
  • 业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果;
  • 系统做了分库分表,但是需要统计所有的数据。

那么此类需求要如何满足呢?我们选择了“通过 ETL 提前进行数据整合”的方案。

什么是 ETL

说到ETL,很多开发伙伴可能会有些陌生,更多的时候 ETL 是用在大数据、数据分析的相关岗位;我也是在近几年的工作过程中才接触到ETL的,现在的项目比较依赖 ETL,可以说是项目中重要的一部分。

ETL 是三个单词的缩写:

  • Extraction:抽取、提取;就是把数据从数据库里面取出来;
  • Transformation:转换;包括但不限于:数据筛选校验、数据关联、数据内容及结构的修改、运算、统计等等;
  • Loading:加载;将处理后的数据保存到目标数据库。

从这三个单词基本可以了解 ETL 的作用:将各个业务系统的数据,通过抽取、清洗、转换之后,将加工后的数据落地到数据库中(数据仓库);在这个过程中,ETL 可以将分散、零乱、标准不统一的数据整合到一起。

使用场景

我接触过的项目,使用 ETL 工具的场景有这个几种:

1. 报表、BI系统:

在公司建设的初期,业务比较少,系统也比较少,一台数据库就搞定了;随着公司业务的增加,业务系统被拆成很多系统;随着数据量的继续增加,单个系统的数据增加到一定程度的时候,也做了分库分表;

这时候领导、业务人员在用数据做分析的时候,数据来源可能是多个系统的多张表,这时候企图通过一个复杂的 SQL 跑出来结果就很困难了;通常公司会建立一个数据仓库,通过 ETL 工具把数据抽取到数据仓库中,再做数据的拟合和展示。

2. 跨系统的数据加工或查询:

我们现在所在公司,业务系统有几百个,由于业务流程比较复杂,前端系统在做业务操作的时候,在正式提交交易之前,有很多业务校验;

比如要查询客户在 X 系统的交易历史,在 Y 系统的交易历史,在 Z 系统的交易历史;那么就需要分别调用 X、Y、Z 系统的接口,这个对前端系统很不友好,那么通常的解决方案是什么?

  • A 方案:做一个中间服务,中间服务去调用 X、Y、Z 系统的接口,客户端直接调用这个中间服务;这种方案只是把前端要做的事情,转移到了中间服务;
  • B 方案:整合 X、Y、Z 三个系统,建服务中台;这种方法很好,但是极为难,对于很多公司来说,别说把 X、Y、Z 三个系统整合成一个中台系统,就是其中一个系统本身进行重构,都是非常困难的;
  • C 方案:把 X、Y、Z 三个系统中需要的数据,通过 ETL 抽取加工到一个数据仓库中,对外提供服务;这个系统最大的好处是在不改造 X、Y、Z 三个系统的前提下,又可以实现跨系统的查询。

我们在 C 方案的基础上又往前做了一步,就是将落地后的数据又做了一次加工,将需要跨表关联的数据,提前关联好存入 MongoDB 中,对外提供查询服务;这样可以将多表关联查询,变成了单表查询。

吐数据 VS 抽数据

接上文中第二个例子中的 C 方案,有些同学可能会有个疑问:数据抽取,需要抽取哪些数据呢?为什么不让这些系统把数据吐出来呢?

答案也简单,“有的时候,数据不一定能吐出来”。

MySQL 数据库往外吐数据有比较成熟的中间件,比如 Canal,它可以通过监听 Mysql 的 binlog 日志来获取数据,binlog 设置为 row 模式,能够获取到每一条新增、删除、修改的日志,同时还能获取到修改前后的数据;

其他商用数据库,比如 Oracle、DB2 等,我也查阅过相关的资料,也是有触发器机制,可以当数据发生变化的时候通知出来,比如调用一段程序,将数据发送到消息队列中,再由其他程序监听消息队列做后续处理。

不管什么类型的数据库,这种“吐数据”的方案,对于基础设施的要求都比较高,并且对原有系统有一定的侵入性;所以我们采用了对原有系统侵入性更小的方案:主动抽数据。

ETL 方案的优缺点

1. 优点

  • 侵入性较低,数据源系统只需要开通数据库的访问权限即可,为保证数据抽取对业务的影响,通常是访问源系统的备库,并且单独设置一个只读权限的数据库用户;
  • 支持不同类型数据源的数据抽取,比如源库有 Mysql、DB2、Oracle,通过 ETL 也可以轻松搞定;
  • 数据整合,将不同业务系统的相同数据整合在一起,比如有些系统 M/F 表示男女,有些系统 1/0 表示男女,ETL 在抽取加工后转换成统一的编码;

2. 缺点

  • 比较致命的一个缺点,就是数据抽取和加工有一定的延迟,需要根据业务场景进行评估,是否接受这个延迟;
  • 可能会受到源库表结构变化的影响;
  • 如果源库中的表没有时间戳,或者时间戳不准确,那么增量抽取就变得很困难;
  • 需要招聘 ETL 开发岗,从我目前的经验看,不是特别好招。
后端MyBatis的多表关联查询优化 在现代的后端开发中,数据库操作是非常重要的一部分。MyBatis作为一款优秀的持久层框架,被广泛应用于数据库操作。多表关联查询是数据库操作中常见且复杂的场景,它涉及到多个表之间的数据关联和查询。然而,不合理的多表关联查询会导致数据库性能下降,影响系统的响应速度和稳定性。因此,本文的目的是深入探讨MyBatis多表关联查询的优化方法,提高查询效率,减少数据库的负载。本文的范围主要涵盖MyBatis多表关联查询的核心概念、算法原理、实际应用、优化策略等方面。 阅读详情

相关推荐

KEPServerEX6教程:IoT Gateway与MQTT Client实现工业数据双向通信

工业物联网的核心挑战在于异构设备协议与云端平台之间的数据互通。Modbus、S7、OPC UA等现场协议纷繁复杂,而上层应用普遍偏好MQTT、REST等轻量接口,此时需要一个可靠的协议转换层。MQTT作为低带宽、高可靠的发布/订阅消息协议,天然适合工业数据采集与远程控制场景。KEPServerEX6作为工业网关软件,内置IoT Gateway与MQTT Client组件,分别承担数据上行发布与指令下行订阅的职责,形成完整的双向闭环。通过配置Modbus TCP设备驱动、创建Tag、设置MQTT Broker

weixin_33787529的博客 391

一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起

作者 l 会点代码的大叔(CodeDaShu)不知道开发的同学有没有遇到过类似这样的需求:相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;业务复杂,一个需求需...

架构师小秘圈 1310

实战派指南:反激电源EMI滤波器设计,从理论计算到PCB布局避坑

本文详细解析了反激式开关电源EMI滤波器设计的全流程,从理论计算到PCB布局避坑,结合34W PD快充电源案例,系统介绍了共模与差模干扰的识别、关键元件选型、参数计算优化及PCB布局技巧,帮助工程师有效解决传导测试超标等常见问题。

weixin_29230805的博客 373

Oracle对于多个大表关联操作如何优化速度?

首先要建立适当的索引。sql在索引字段不要加函数,保证索引起效。如果是复合索引注意在sql的顺序。如果已经存在索引,建议你先重建索引先,因为大数据表的索引维护到了一个阶段就是乱的,一般建议重建。建立好的一般可以获得几十倍的速度提升。 最大数据量的表放在最前,最小的表放在最后面。sql是从最后面开始反向解析的。 其次是要把最有效缩小范围的条件放到sql末尾去。尤其是主键或者索引字段的条件。 保证你sq

极客神殿 2万+

《数据结构》04-树4 是否同一棵二叉搜索树

题目 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。 输入格式: 输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要...

叫我皮卡丘 2012

手把手教你驱动6脚三位一体数码管:从引脚分析到C语言扫描代码实战

本文详细解析了如何逆向工程并驱动6脚三位一体数码管的全过程,从引脚分析到C语言扫描代码实战。通过系统化的测试和优化,作者总结出一套高效的驱动架构和调试方法,适用于工业设备中的非标准数码管应用。

weixin_42632434的博客 213

oracle表连接深入浅出

oracle表连接深入浅出

冰刀(skate) 2529

【STM32】R05D电控红外协议的美的空调遥控器

目录一、设计思路一、R05D红外协议原理1.协议手册理解2.验证时序(重点)二、硬件实现1.需要的材料2.对发射模块电路进行修改3.STM32 GPIO选择三、代码实现1.载波38kHZ实现2.R05D时序实现3.调用函数并验证 一、设计思路 通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。 解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。 一、R05D红外协议原理 R05D电控功

weixin_42204837的博客 1万+

mybatis一个表关联很多的表,好多是多对多的关联关系,有必要建关联对象么

不建议使用关联对象   hb都一般不建议使用  设置关联的时候  会影响sql查询效率   特别是在数据量大的情况下  关联对象导致查询很多不必要的字段信息 ,员工表中你只需要用到部门表中的部门名字,如果你使用关联对象,你会把部门表中的所有字段给查询出来,所以不建议,需要用到什么字段就查啥字段,别为了使用方便盲目添加关联信息 mybatis本来就是手写sql的半自动化框架~不要搞hibe

menghuannvxia的专栏 1322

Opencv计算机视觉PPT-算法篇

01 02 03 04 05 06 07 08 09 010 011 012 013 014 015 016 017 018

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 206

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

XiaoqiangClub的博客 3367

oracle 表关联索引优化,Oracle执行计划调优-超级大表关联超级小表的性能调优

今日客户现场出现一个查询SQL异常慢的情况。用时分钟级别。SELECT *FROM (SELECT a1.*, rownum rnFROM (SELECT openOrder2017.exchId,............openOrder2017.internalbizmark,customer.typeIdListFROM openOrder2017, customerWHERE openOr...

weixin_28835789的博客 940

LeRobot 机器人学习(Robot Learning)入门教程(一)

本文介绍了现代机器人学习领域的发展现状与关键技术。随着机器学习进步和大规模机器人数据的普及,机器人技术正从传统基于模型的方法转向数据驱动的学习范式。HuggingFace开发的开源库lerobot实现了端到端集成,支持多种机器人平台和先进算法(强化学习、行为克隆等)。核心创新包括LeRobotDataset标准化格式,统一处理多模态时间序列数据,并支持高效批处理和流式访问。教程涵盖经典机器人学基础、强化学习原理、模仿学习技术和通用模型开发,结合代码示例展示如何构建适应多样化任务的机器人系统。该资源旨在为研究

2506_90492529的博客 1997

关联查询太慢_一个接口查询关联了十几张表,响应速度太慢

不知道开发的同学有没有遇到过类似这样的需求:相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果;系统做了分库分表,但是需要统计所有的数据。那么此类需求要如何满足呢?我们选择了“通过 ETL 提前进行数据整合”的方案。01什么是 ETL说到ETL,很多开发伙伴可能会有些陌生,更多的时候 ETL 是用在大数据、数据...

weixin_39797758的博客 834

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整到一起

不知道开发的同学有没有遇到过类似这样的需求: 相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口; 业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果; 系统做了分库分表,但是需要统计所有的数据。 那么此类需求要如何满足呢?我们选择了“通过 ETL 提前进行数据整合”的方案。 什么是 ETL 说到ETL,很多开发伙伴可能会有些陌生,更多的时候 ETL 是用在大数据、数据分析的相关岗位;我也是在近几年的工作过程中才接触到ETL的,现在的项目比较依赖 ETL,可以说是项目

会点代码的大叔 1810

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

oracle关联表查询使用索引_一个接口查询关联了十几张表,响应速度太慢?怎么办?...

推荐阅读:秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等MySQL复习:20道常见面试题(含答案)+21条MySQL性能调优经验2020春招必备:MySQL(20)与Redis(20),不看答案能答对几道?不知道开发的同学有没有遇到过类似这样的需求:相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;业务复杂,一个需求需要关联几...

weixin_39823459的博客 326

oracle关联表查询使用索引_一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起...

[ 用大白话讲解复杂的技术 ]这是我的第35篇原创文章作者 l 会点代码的大叔(CodeDaShu)不知道开发的同学有没有遇到过类似这样的需求:相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果;系统做了分库分表,但是需要统计所有的数据。那么此类需求要如何满足呢?我们选择了“通过 ETL 提前...

weixin_39744554的博客 489

db2 修改表空间自增长_一个接口查询关联了十几张表,响应速度太慢?怎么办?...

推荐阅读:秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等MySQL复习:20道常见面试题(含答案)+21条MySQL性能调优经验2020春招必备:MySQL(20)与Redis(20),不看答案能答对几道?不知道开发的同学有没有遇到过类似这样的需求:相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;业务复杂,一个需求需要关联几...

weixin_33365844的博客 150

如何优化多表关联查询?从原理到实践的完整指南

多表关联查询优化指南:从原理到实践 摘要:随着数据量增长,多表关联查询性能问题日益突出。本文从底层原理出发,分析嵌套循环、哈希和合并连接三种算法特性,提出全链路优化方案:1)索引优化,确保关联字段建索引并避免失效;2)SQL写法优化,遵循小表驱动大表原则,精简查询字段;3)表结构优化,适度冗余和分库分表;4)执行计划分析定位瓶颈。同时指出常见误区如盲目加索引、类型不一致等,并推荐数据库工具辅助优化。通过系统性的优化策略,可显著提升多表查询性能。

码路同行 667

Flink SQL多字段的维表关联查询-flink-connector-redis

Flink SQL经常需要关联维表,使用redis作为维表存储介质能获得较快的响应速度,大多情况维表有多个字段,写入与维表查询时只能使用concat与table function函数处理,非常麻烦。有没有更简单的方法呢?本示例基于展示如何利用’value.data.structure’='row’写多字段并关联查询,无需定义table function函数。

zilong00007的专栏 2728

查询优化:SQL优化,关于连多表查询

查询优化:SQL优化 场景:当列表展示的数据来自很多表中的数据时,由于需要实现相关的查询条件,WHERE涉及到每张表时,需要用JOIN连接查询出相关数据(比如查询采购单数据:有采购单、采购单明细、入库数据、报损数据、取消数据、请款数据、采购合同、产品信息等等),JOIN连接查询也很方便地获取到要返回的数据,但是问题来了,这么多表查询起来关联的数据非常多,查询耗时很大,甚至超过30秒,影响用户体...

平凡老者 3686

怎样在 PostgreSQL 中优化对大表关联的网络开销?

优化大表关联的网络开销是一个综合性的问题,需要我们从多个方面入手。通过合理使用索引、选择合适的关联方式、采用分页查询、进行数据分区、减少数据传输量以及优化数据库服务器配置等方法,我们可以有效地提高数据库的性能,减少网络开销,从而为用户提供更快的响应速度和更好的用户体验。在实际应用中,我们需要根据具体的业务需求和数据库环境,灵活运用这些优化方法。同时,我们还需要不断地进行测试和优化,以确保数据库的性能始终保持在一个较高的水平。

发现生活,分享智慧,一起成长! 1296

MyBatis 进阶:连接池、动态 SQL 与多表关联查询

MyBatis 作为一款灵活的持久层框架,除了基础的 CRUD 操作,还提供了连接池管理、动态 SQL 以及多表关联查询等高级特性。本文将从连接池原理出发,深入讲解动态 SQL 的常用标签,并通过实例演示一对多、多对多等复杂关联查询的实现,帮助你掌握 MyBatis 的进阶用法。

m0_61261153的博客 1172

针对多表关联查询场景,通过分析关联条件与数据分布,优化 JOIN 语句连接顺序及关联类型的性能提升操作

多表关联查询:挑战与重要性​在当今数字化时代,数据已成为企业决策和发展的核心驱动力。关系型数据库作为数据存储和管理的重要工具,被广泛应用于各种应用系统中。在这些数据库中,数据通常被分散存储在多个表中,通过多表关联查询,我们能够将这些分散的数据整合起来,为业务提供全面、准确的信息支持。​以电商系统为例,用户信息存储在用户表中,订单信息存储在订单表中,商品信息存储在商品表中。当我们需要查询某个用户的订单详情及所购买商品的信息时,就需要通过多表关联查询,将用户表、订单表和商品表中的数据进行关联,从而获取到完整的信

xiaoniao899的博客 573

多表关联查询总是慢?EF Core这3种写法让你性能提升10倍

掌握Entity Framework Core多表连接查询性能优化秘诀,3种高效写法显著提升查询速度。适用于复杂业务场景,通过预加载、显式连接和原生SQL结合,减少数据库往返,大幅提升响应效率,值得收藏。

QuickDebug的博客 826
上一篇: 这份“SSM”面试集锦,让你轻松应对框架轰炸
下一篇: ZooKeeper灵魂27连问,这谁顶得住?
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值