为什么你的MyBatis查询越来越慢?真相竟是association嵌套使用不当!

Mybatis分页插件(PageHelper)数据量大时查询慢的解决方案 在使用 MyBatis 分页插件 PageHelper 时,若数据量较大导致查询性能下降,通常是由于插件默认的。:复杂的子查询(如多层嵌套)会导致临时表生成,增加计算开销。:适用于实时性要求高的场景(如消息列表),通过记录最后一条数据的 ID 实现增量查询,避免。PageHelper 默认会执行两次 SQL:一次带分页的查询,另一次是统计总行数的。:将分页查询与统计逻辑拆分为异步任务,先返回部分数据,后台补充统计结果。:首次加载少量数据,用户滚动时按需加载后续页,减少单次查询压力。 阅读详情

第一章:MyBatis中association嵌套查询的性能陷阱

在使用 MyBatis 进行复杂对象映射时,association 标签常用于处理一对一关联关系。然而,当采用嵌套查询(nested query)方式实现关联映射时,若未合理设计 SQL 语句和映射逻辑,极易引发“N+1 查询问题”,造成严重的性能瓶颈。

嵌套查询的工作机制

MyBatis 的 association 支持通过独立的 select 语句加载关联对象。例如,在查询订单的同时,通过嵌套查询加载用户信息。但这种方式会导致主查询每返回一条记录,就触发一次关联查询。
<resultMap id="OrderResultMap" type="Order">
  <id property="id" column="order_id"/>
  <result property="orderNo" column="order_no"/>
  <!-- 每条订单记录都会触发一次 getUserById 查询 -->
  <association property="user" column="user_id"
               select="getUserById"/>
</resultMap>
上述配置在处理 100 条订单数据时,将执行 1 次主查询 + 100 次用户查询,显著增加数据库负载。

优化策略对比

以下为两种常见解决方案的对比:
方案SQL 次数优点缺点
嵌套查询N+1逻辑清晰,易于维护性能差,易导致数据库压力过大
关联查询(JOIN)1高效,减少数据库交互次数结果集可能存在重复数据,需合理配置 resultMap
推荐使用 JOIN 方式一次性获取所有数据,并通过 association 的嵌套 resultMap 映射关联对象:
<resultMap id="OrderJoinResultMap" type="Order">
  <id property="id" column="order_id"/>
  <result property="orderNo" column="order_no"/>
  <association property="user" javaType="User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
  </association>
</resultMap>
此方式通过单次多表联查完成数据加载,避免了循环查询带来的性能损耗。

第二章:深入理解association标签的核心机制

2.1 association标签的基本语法与映射原理

在MyBatis中,``标签用于处理一对一的关系映射,常用于将查询结果集中的关联字段封装到嵌套的对象属性中。
基本语法结构
<resultMap id="userMap" type="User">
  <id property="id" column="user_id"/>
  <result property="name" column="user_name"/>
  <association property="profile" javaType="Profile">
    <result property="email" column="email"/>
    <result property="phone" column="phone"/>
  </association>
</resultMap>
上述代码定义了一个用户与个人资料的一对一映射。`property="profile"` 指明Java实体中的属性名,`javaType` 指定其类型。内部的 `` 标签将数据库字段映射到嵌套对象的属性。
映射原理
当执行SQL查询时,MyBatis根据`resultMap`解析结果集,通过列前缀或别名识别出关联对象的数据片段,并利用反射机制实例化并填充嵌套对象,最终完成复杂对象图的构建。

2.2 嵌套查询与嵌套结果的区别及适用场景

概念解析
嵌套查询是指在一个查询语句中包含另一个查询,常用于条件筛选;而嵌套结果则是通过一次查询返回层级化的结构数据,常见于对象关系映射(ORM)中。
典型应用场景
  • 嵌套查询:适用于动态条件过滤,如查找“订单金额高于平均值的用户”。
  • 嵌套结果:适合加载关联对象,如一次性获取用户及其所有订单列表。
SELECT * FROM users 
WHERE id IN (SELECT user_id FROM orders WHERE amount > (SELECT AVG(amount) FROM orders));

该SQL使用嵌套查询,三层结构分别获取高消费用户。子查询独立执行,外层依赖其结果,逻辑清晰但性能开销较大。

特性嵌套查询嵌套结果
执行方式逐层求值联合JOIN一次性加载
性能较低(多次访问)较高(减少IO)

2.3 N+1查询问题的本质剖析

问题起源与典型场景
N+1查询问题通常出现在ORM框架中,当获取N条记录后,对每条记录再发起一次额外的关联查询,导致共执行N+1次SQL。
  • 初始查询:1次获取主表数据
  • 后续查询:N次加载关联数据
代码示例与分析
-- 初始查询
SELECT id, name FROM users;

-- 随后的N次查询(每用户一次)
SELECT * FROM posts WHERE user_id = ?;
上述模式在处理100个用户时将触发101次数据库访问,极大影响性能。
性能影响对比
查询方式查询次数响应时间趋势
N+1模式N+1线性增长
预加载2基本恒定

2.4 关联对象初始化时机与懒加载机制详解

在面向对象系统中,关联对象的初始化时机直接影响运行时性能与内存占用。过早初始化可能导致资源浪费,而懒加载(Lazy Loading)则按需创建对象实例,优化系统开销。
懒加载核心逻辑
通过延迟初始化关联对象,直到首次访问时才触发加载。常见于ORM框架或依赖注入容器中。
type Order struct {
    ID      int
    User    *User
    loaded  bool
}

func (o *Order) GetUser() *User {
    if !o.loaded {
        o.User = fetchUserFromDB(o.ID) // 实际查询
        o.loaded = true
    }
    return o.User
}
上述代码中,User对象仅在GetUser()被调用时初始化,避免了无谓的数据库查询。
初始化时机对比
策略初始化时机适用场景
eager 创建主对象时 关联数据必用,且代价小
lazy 首次访问属性时 数据庞大或非必现路径

2.5 使用日志分析SQL执行次数的实际案例

在一次性能调优项目中,系统响应缓慢,初步怀疑是数据库访问频繁所致。通过开启MySQL的慢查询日志与通用查询日志,结合pt-query-digest工具进行分析。
SET global general_log = 'ON';
SET global log_output = 'table';
-- 运行业务操作后查询日志表
SELECT argument FROM mysql.general_log WHERE argument LIKE '%SELECT%';
上述命令启用通用日志并记录所有SQL语句。通过脚本统计日志中各SQL出现频次,发现某订单状态同步任务在10分钟内执行了超过1.2万次相同查询。
高频SQL识别结果
SQL语句执行次数平均耗时(ms)
SELECT status FROM orders WHERE id = ?12,4878.2
UPDATE inventory SET stock = ? WHERE pid = ?3,20115.6
进一步分析确认该查询被置于循环中逐条调用,改为批量查询后,执行次数降至97次,系统吞吐量提升近6倍。

第三章:常见性能瓶颈的识别与诊断

3.1 通过MyBatis日志定位重复查询问题

在高并发场景下,MyBatis执行的SQL可能因缓存失效或循环调用被多次触发,导致性能下降。开启MyBatis日志功能是排查此类问题的首要步骤。
启用日志输出
通过配置log4j或slf4j,将SQL执行日志打印到控制台:
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
该配置启用标准输出日志,可实时观察每条SQL的执行频次与参数。
分析重复调用模式
观察日志中相同SQL的出现频率,若同一查询在单次请求中反复出现,可能存在N+1查询问题。结合调用栈分析,定位DAO层被误用的位置。
  • 检查Service层是否在循环中调用了数据库查询
  • 确认是否未启用二级缓存或一级缓存被手动清除
  • 使用日志时间戳统计查询间隔,判断是否为缓存穿透

3.2 利用数据库慢查询日志辅助分析

数据库慢查询日志是定位性能瓶颈的重要工具,通过记录执行时间超过阈值的SQL语句,帮助开发者识别低效查询。
开启慢查询日志
在MySQL中,可通过以下配置启用慢查询日志:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_output = 'FILE';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
上述命令将慢查询日志写入指定文件,long_query_time = 1 表示记录执行时间超过1秒的SQL。
分析慢查询日志
使用 mysqldumpslow 或 pt-query-digest 工具解析日志:
  • mysqldumpslow -s c -t 10 slow.log:按出现次数排序,显示前10条高频慢查询
  • pt-query-digest slow.log:生成详细统计报告,包括执行时间分布、锁等待等指标
结合执行计划(EXPLAIN)优化SQL,可显著提升系统响应速度。

3.3 使用Arthas或JProfiler进行调用链追踪

在分布式系统中,精准定位性能瓶颈依赖于高效的调用链追踪工具。Arthas 和 JProfiler 是两类典型代表:前者适用于线上诊断,后者擅长深度性能分析。
Arthas 快速方法追踪
通过字节码增强技术,Arthas 可实时监控方法调用。例如使用 `trace` 命令追踪服务调用链:
trace com.example.service.UserService getUserById
该命令输出方法执行路径及耗时分布,支持条件表达式过滤异常调用,适用于生产环境无侵入诊断。
JProfiler 深度性能剖析
JProfiler 提供图形化界面,可捕获 CPU、内存、线程栈等多维度数据。配置探针后启动应用,即可生成调用树(Call Tree),精确识别热点方法。其 CPU Profiling 支持采样与插桩两种模式,兼顾性能开销与数据精度。
工具适用场景侵入性
Arthas线上问题排查低
JProfiler开发期性能优化中

第四章:优化association嵌套查询的实战策略

4.1 合理使用嵌套结果(resultMap)避免N+1

在 MyBatis 中,N+1 查询问题通常出现在关联对象的懒加载场景中,导致频繁访问数据库。通过合理设计 <resultMap>,可有效避免该问题。
嵌套结果映射的优势
使用嵌套 resultMap 能在一次查询中完成主实体与关联对象的加载,减少 SQL 执行次数。
<resultMap id="BlogWithAuthor" type="Blog">
  <id property="id" column="blog_id"/>
  <result property="title" column="title"/>
  <association property="author" javaType="Author">
    <id property="id" column="author_id"/>
    <result property="name" column="author_name"/>
  </association>
</resultMap>
上述配置通过单次联表查询将 Blog 与 Author 一并加载,避免了为每个 Blog 单独查询 Author 的 N+1 问题。其中 association 定义了嵌套对象的映射规则,column 指定结果集字段,property 对应 Java 实体属性。
  • 减少数据库往返次数,提升查询性能
  • 适用于一对一、一对多等复杂对象关系映射

4.2 开启lazyLoading并控制关联加载粒度

在 MyBatis 中,lazyLoadingEnabled 配置项用于开启懒加载机制,避免一次性加载所有关联对象,提升查询性能。
启用懒加载
需在 mybatis-config.xml 中设置:
<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="false"/>
</settings>
其中,aggressiveLazyLoading="false" 表示仅加载被调用的关联属性,而非全部。
控制关联加载粒度
通过 @Results 注解精确指定懒加载关联:
@Result(property = "orders", 
        column = "id", 
        many = @Many(select = "selectOrdersByUserId", fetchType = FetchType.LAZY))
该配置表示用户信息加载时不立即查询订单,仅在调用 getUser().getOrders() 时触发 SQL 查询。
  • 优点:减少不必要的 JOIN 查询,降低内存开销
  • 适用场景:一对多、多对多关系中非必现数据

4.3 结合分页查询优化关联数据检索效率

在处理大规模关联数据时,全量加载会导致内存溢出和响应延迟。采用分页查询结合懒加载策略,可显著提升系统性能。
分页查询SQL示例
SELECT u.id, u.name, o.order_id, o.amount 
FROM users u 
LEFT JOIN orders o ON u.id = o.user_id 
WHERE u.status = 1 
ORDER BY u.id 
LIMIT 20 OFFSET 40;
该语句通过 LIMIT 和 OFFSET 实现分页,避免一次性拉取全部关联记录。参数 20 表示每页大小,40 为偏移量,适用于前端第3页展示(页码从1开始)。
优化建议
  • 为关联字段建立复合索引,如 (user_id, created_at)
  • 使用游标分页替代基于OFFSET的分页,避免深度翻页性能衰减
  • 结合缓存机制,对热点用户数据进行预加载

4.4 使用二级缓存减少重复数据库访问

在高并发系统中,频繁的数据库访问会成为性能瓶颈。引入二级缓存可显著降低数据库负载,提升响应速度。二级缓存位于持久层框架(如MyBatis或Hibernate)与应用之间,共享于多个会话之间。
缓存工作流程
当查询请求到达时,系统首先检查二级缓存是否存在对应数据;若命中则直接返回,避免数据库访问;未命中则查询数据库,并将结果写入缓存供后续使用。
配置示例(MyBatis)
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
该配置启用Ehcache作为MyBatis的二级缓存实现,type指定缓存类,自动管理实体对象的序列化与过期策略。
缓存更新策略
  • 读写模式(READ_WRITE):支持并发修改,避免脏读
  • 定时失效:通过flushInterval设置刷新周期
  • 事务提交后清空本地缓存,确保一致性

第五章:总结与最佳实践建议

性能监控与调优策略
在高并发系统中,持续的性能监控是保障服务稳定的关键。推荐使用 Prometheus + Grafana 组合进行指标采集与可视化,重点关注请求延迟、错误率和资源利用率。
  • 定期执行压力测试,识别系统瓶颈
  • 设置告警规则,如 CPU 使用率超过 80% 持续 5 分钟触发通知
  • 利用 pprof 工具分析 Go 应用的内存与 CPU 占用情况
代码层面的最佳实践
遵循清晰的编码规范可显著提升维护效率。以下是一个带上下文超时控制的 HTTP 请求示例:

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()

req, _ := http.NewRequestWithContext(ctx, "GET", "https://api.example.com/data", nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    log.Printf("请求失败: %v", err)
    return
}
defer resp.Body.Close()
部署与配置管理
使用环境变量或配置中心(如 Consul、Apollo)管理不同环境的参数,避免硬编码。关键配置应加密存储并支持动态刷新。
配置项生产环境值说明
DB_MAX_CONNECTIONS100数据库最大连接数
REDIS_TIMEOUT_MS500Redis 操作超时时间
安全加固措施
确保 API 端点启用 HTTPS,并对敏感接口实施速率限制。使用 JWT 进行身份验证时,应设置合理的过期时间并支持令牌吊销机制。
26届数字IC秋招笔试面试全攻略-UVM验证方法学精要 本文介绍了数字IC验证中UVM方法学的核心内容,包括组件架构、Sequence机制和寄存器模型。UVM提供env、agent、driver等组件构建验证环境;Sequence机制通过item、sequence和sequencer实现激励生成与控制;寄存器模型则通过reg_block、reg等组件管理DUT寄存器。文章详细说明了各模块的功能、交互关系和代码实现,为IC验证工程师提供了完整的UVM应用指南,重点突出了验证环境的搭建方法、激励生成流程和寄存器抽象技术。这些内容是数字IC秋招笔试面试中的高频考点。 阅读详情

相关推荐

告别龟速与断连:Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南

本文提供Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南,解决下载速度慢、断连等常见问题。通过国内镜像源加速、详细步骤讲解和ESP32-CAM专属配置技巧,帮助开发者快速完成环境搭建,避免常见陷阱,提升开发效率。

weixin_30576827的博客 771

C# Stream 深度解析:生命周期、缓冲区与异步状态机陷阱

Stream 是 .NET 中最基础也最易误用的 I/O 抽象,其本质并非简单字节序列,而是融合资源管理、缓冲策略与异步调度的复合契约。理解 Stream 生命周期管理与缓冲区边界控制,是避免线上 OOM、连接泄漏和数据截断的关键;掌握异步状态机陷阱与可重用流封装,则直接决定高并发文件处理、HTTP 流式上传及日志聚合等场景的稳定性与性能。本文从底层原理出发,覆盖 FileStream、MemoryStream、NetworkStream 等核心实现差异,揭示 Dispose 行为、ReadAsync 位置

chuji3953的博客 306

[零基础]用docker搭建Hadoop集群

[零基础]用docker搭建Hadoop集群,每一步都有详细的解释!

weixin_56114243的博客 2万+

mysql mybatis分页查询 大数据量 非常慢

然后自定义一个查询count的方法,在接口上面添加上@cacheable注解(具体实现自行百度),如果下一次查询的条件和上次的条件一致,则直接返回结果,就不需要跟数据库进行交互。为什么说这个方法对于连表查询有用呢,是因为连表查询,sql比较复杂,通过自带的count肯定查询条件一致,但是自定义的话就只查询主表数量就足够了,不需要连表进行count。看了很多帖子,要么就是数据库记录数据、或者来一条数据更新一下总数、或者多线程一个查询列表一个程序总数等等,这些方法都不适用于正常的待条件分页查询,可以忽略。

qq_36178165的博客 5865

SPSS线性混合模型实战:手把手复现一篇老年认知研究的统计结果(含代码)

本文详细介绍了如何使用SPSS线性混合效应模型复现老年认知研究的统计结果,涵盖数据准备、模型构建、结果解读及可视化全流程。特别针对重复测量数据分析,提供了SPSS菜单操作与语法编写的实用技巧,帮助研究者高效处理复杂数据并验证模型假设。

weixin_42562079的博客 517

unity游戏开发日志(一)将mmd模型导入unity,并解决材质丢失的问题

unity音乐游戏开发,导入角色模型并解决材质问题

yizhigou1的博客 1762

Mybatis-Plus分页插件查询慢解决方案

一次接口响应慢的优化经验。

hoho_12 8271

GD32F103RCT6/GD32F303RCT6(6.2)USART串口实战:从寄存器配置到DMA高效传输

本文详细介绍了GD32F103RCT6和GD32F303RCT6的USART串口通信实战,从寄存器配置到DMA高效传输的全过程。通过具体的代码示例和优化建议,帮助开发者快速掌握串口通信的关键技术,提升嵌入式开发效率。特别强调了DMA在高速数据传输中的优势和应用技巧。

weixin_33725239的博客 308

MySQL分页到了后面越来越慢,有什么好的解决办法?

MySQL 分页查询在数据量较大时,随着页数的增加查询时间也会越来越长,这是正常的现象。为了提高查询性能,可以采用以下方法: 建立适当的索引,以加速查询。 使用 LIMIT 和 OFFSET 参数进行分页,而不是使用 ROW_NUMBER() 函数。 对查询的字段使用 SELECT * 时,可能会导致不必要的数据访问,因此建议使用 SELECT column1, column2, … 这样的...

weixin_35755434的博客 1101

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【用户入网定期复评】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【用户入网定期复评】。

qq_45776114的博客 837

mybatis 分页插件卡,查询效率慢

使用mybatis分页的时候发现我的分页查询超慢也就几百万条数据,于是排除原因 步骤1:发现是排序导致查询慢; 步骤2:排序慢的原因:不是索引问题,是我的主表在分页前进行了联表查询;我滴天呐! 几百万条数据联表能快吗,关键是联表后不能通过索引排序了?这应该算是分页插件的bug了。强烈建议 大神升级分页插件。 步骤3:改造分页插件;思路中间绕的路就不说了。在mybatis里面写两个查询,一个主表...

songqiang2011的博客 8064

YOLOv11 损失函数进阶:Varifocal Loss 让正负样本精度双升

创建self.alpha = alpha # 正样本权重系数self.gamma = gamma # 聚焦系数self.lambda_reg = lambda_reg # 回归损失权重# 分类损失:Varifocal Classification Loss# 正样本权重:基于预测置信度# 计算 BCE 损失并加权cls_loss = cls_loss.sum() / (cls_true.sum() + 1e-6) # 按正样本数归一化。

m0_71589036的博客 441

mybatis分页卡顿分析解决

2、对应list的sql,在mapper.xml里,自己手搓一个xxx_count,如原来是queryAbcList查询列表,那么需要在写一个queryAbcList_ COUNT方法,这里就可以很好的发挥了,order by ,inner join 都去掉;分页卡顿接近一分钟,slow sql 显示 select count(0) 的时候耗时25秒,inner join order by 一堆问题,索引走了,explain 显示row还有6w多。当然如果索引能解决最好,解决不了使用如上方法。

Dead_Cicle 1432

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring JDBC 被低估了吗?—— 关于 MyBatis 与 Spring JDBC 复杂度的祛魅

本文对比分析了MyBatis与Spring JDBC的核心差异,指出主流观点存在认知偏差。通过信噪比分析,揭示MyBatis的XML配置实际带来70%以上无关噪音,而Spring JDBC的"冗长"仅是Java语法本身。深入剖析MyBatis设计缺陷:其复杂度源于解决自创问题(如OGNL、XML标签等),而非数据库访问本质;动态SQL只是将Java逻辑平移到XML,未提升抽象层级;黑盒设计导致扩展困难,需掌握复杂插件机制。相比之下,Spring JDBC保持透明性,直接使用Java控制逻辑,通过AOP即可简

gzz_gzz的博客 599

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用Mybatis分页插件(PageHelper)导致数据量大时查询慢的解决方法

描述: 在项目中使用MybatisPlus分页插件分页查询十分缓慢,但是在数据库中执行速度却很快? 该数据库的表共有10000条数据,分页查询时,在数据库中是很快,但是在使用Mybatis分页插件的时候居然8s多! 原因: PageHelper在做分页查询的时候,select count(0) 会先把原来的查询语句全部重新查询一遍(未做数量限制),然后再执行select count(0)操作,导致查询速度慢。例如: select count(*) from ("这里面的把sql又多重复查了一遍") user

慢积跬步的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mybatis plus selectJoinPage 查询太慢问题解决

mybatisPlus 默认的count sql是 select count(*) from (sql),sql为查询数据的sql.通过测试发现select 里没有distinct的关键字,只扫主表,如果加上distinct关键字就会扫整个sql。通过打印sql发现,是获取total时查询过慢,因为使用了多个leftJoin.最重要 是这点:.使count里的sql只有主表,没有leftJoin表。分析:因为分页本身数据不大,最多也就几十条,速度不应该太慢。项目中遇到,数据量如果过大,分页查询就很慢。

qq_43921238的博客 3569

PageHelper插件使用Mybatis二级缓存完美解决分页查询慢问题

PageHelper使用Mybaatis二级缓存完美解决分页慢问题

Java全栈领域/离线地图/微服务 6030

Mybatis plus 大数据量查询慢问题

大数据量操作一般用在在实际工作中当中,查询数据过大

bai_mi_student的博客 1863

Mybatis-plus 分页查询的“坑”(不,是我不会用)

像百度,谷歌一样不需要展示具体页数和总条数,然而,上面我说的这些,没有打动产品经理,也没时间所有界面挨个修改,那目前就只能继续处理数量查询。经常做列表界面性能优化的小伙伴都遇到过这样的情况,索引什么的都命中,但是性能就是不好,其中一种情况就是因为 列表为分页查询,列表查询本身挺快的,但是拿到分页的count语句在数据库中执行慢的一批。因为,sql的select用了这样的函数,然后再去分页查询,这种本来就是不正确的使用方式,兼容了最好,报错提示开发者也行。不处理,也能接受吧,程序员自己使用错误在先。

yang11qiang的博客 2376

MyBatis Plus 解决大数据量查询慢问题

发表于天津专注原创,Java后端,大数据,架构设计,消息队列,Python技术,面试题,数据结构与算法,职场经验分享,致力打造一个有营养的公众号。77篇原创内容公众号大数据量操作的场景大致如下:数据迁移数据导出批量处理数据在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数据时,如果一下子将数据全部加载出来到内存中,很可能会发生OOM(内存溢出);

竹林幽深 748

MyBatis 延迟加载(懒加载)—— association 延迟加载、collection 延迟加载

一、概述 1、延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载 2、好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。 3、坏处: 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。 4、MyBatis 多表查询 在多表查询时,使用了resultMap来实现一对一,一对多,多对多关系的操作。主要是通过

骑着蜗牛行天下 860

MyBatis Plus分页性能拉胯?这7招让你秒变优化高手!

MP分页插件极大的提升了开发效率,但随着数据量从几万涨到百万、千万级,点“下一页”等半天、页面卡成PPT的情况,相信很多人遇见过。问题根源往往出在MP默认的分页逻辑——基于OFFSET+LIMIT的物理分页,在OFFSET过大时,数据库需要扫描前N条数据再丢弃,效率直线下降。今天就结合实战经验,聊聊如何用7招把分页性能从“龟速”提到“火箭”,让用户再也不用对着加载中的转圈干瞪眼!

weixin_42148384的博客 1440

MyBatis中的多表查询以及延迟加载

目录IntroresultMap的使用场景resultMap的标签一对多关系AccountDao.xml一对一查询结果多对多关系UserDao.xml多对多查询结果延迟加载lazy loading本质实现lazy loading(以association为例) Intro 业务中往往多个表之间会存在关联关系,比如用户和银行账户之间,通过在账户中加上用户id作为外键来实现两个表的关联。类似的情况有一对一、多对多、一对多、多对一等状况。显然,在实现账户的javabean类的时候,如果把用户的信息直接作为属性保存

weixin_43896141的博客 222

Mybatis-plus 分页查询缓慢;临时表相关问题

MyBatis-Plus分页查询在正式环境性能下降问题分析 问题现象:测试环境正常的MyBatis-Plus分页查询,在正式环境变慢,但直接执行SQL正常。 根本原因:查询中使用DISTINCT导致MyBatis-Plus无法优化count查询,生成临时表。MySQL优先使用内存临时表,但数据量大时会退化为磁盘临时表,导致性能急剧下降。 关键发现: MyBatis-Plus分页会生成count和data两个SQL 带DISTINCT的count查询会生成子查询和临时表 去除DISTINCT后count查询被

qq_39889242的博客 968
上一篇: Spring事务中no-rollback-for的秘密(只有资深架构师才知道的异常继承链影响)
下一篇: 【Java类加载器深度解析】:getResourceAsStream使用陷阱与最佳实践
CompiTide
博客等级 码龄1年 174粉丝 2175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值