对于逻辑分页与物理分页的分析与选择(MyBatis-Plus的分页实现),理解两种分页的异同点

背景:

写分页查询时,对于手续费账单分页查询需求的实现分析。

分页查询

因为项目中大多都是用了ORM框架(多为Mybatis/MyBatis-Plus),所以分页查询可以使用框架自带的分页插件,当然也可以手写SQL来实现分页查询,这属于两种分页方式。前者为逻辑分页(Mybatis为逻辑分页,MyBatis-Plus为物理分页),后者为物理分页。

逻辑分页:逻辑分页依赖于查询结果集(Java代码侧)。其是先查询出所有的数据,再根据分页要求筛选出合适的数据进行分页。它是半自动化的一个分页(因为需要传递相关分页参数,所以是半自动化的);
物理分页:物理分页依赖于SQL语句(数据库侧)。其是使用数据库自带的limit关键字进行数据分页,只查询出分页的数据,数据库返回的数据就是分页结果。物理分页就是手写SQL语句实现的分页。

在开发中,这两种分页方式需要根据实际需求进行选择。这里只针对目前我涉及到的手续费账单分页查询分析:

  1. 数据量: 手续费账单出账周期为月,所以数据量却不会特别大,因此哪怕查询全部手续费账单数据SQL执行速度也很快。所以从数据量维度看分页可以使用逻辑分页,且因为逻辑分页只会查询一次数据库,之后就会把手续费账单数据存在内存中,不会像物理查询一样每次查询请求过来都会去访问数据库,减轻了对数据库的负担。
  2. 服务器: 虽然逻辑分页一次性将所有的数据读取至内存中,占用了较大的内存空间;物理分页每次只读取所需的数据占用内存比较小,但手续费账单查询对于商户侧应该更注重商户体验,存在内存中之后会显著减少对数据库的访问,基于内存的数据操作加快了请求响应速度,对于服务器的内存压力则可以通过硬件升级去弥补(内部管理侧则可以考虑使用物理分页,但一样需要综合数据量及其他性能影响)。
  3. 实时性: 逻辑分页一次性将数据全部查询出来然后存储在内存中,如果数据库中的数据在第一次查询之后发生了改变,逻辑分页就不能够获取最新数据(因为内存的数据不能自动更新数据),可能导致脏数据的出现,实时性较低;而物理分页每一次分页都需要从数据库中进行查询,这样能够获取数据库中数据的最新状态,实时性较高。但对于手续费账单查询这个需求来说,因为手续费账单出账周期为月,所以对数据实时性要求是很低的,因此可以直接忽略掉逻辑分页的数据一致性问题选择逻辑分页。

综上,选择使用逻辑分页实现分页查询手续费账单需求。但对于手续费账单明细等数据量比较大的需求还是考虑选择使用MyBatis-Plus自带的分页插件(PaginationInterceptor:配置简单)进行物理分页实现分页查询需求。但使用MyBatis-Plus的物理分页也会有一定问题,如虽然通过调用其API实现分页查询非常方便,但是这并不能保证生成的SQL语句就是最优的。特别是在一些复杂的查询场景下,很可能需要手动编写SQL语句,进行优化处理,才能提高查询效率。

总之,MyBatis-Plus虽然是一个很好的增强工具包可以加速我们开发速度并减少开发代码量,但是在使用它的同时需要注意性能问题,尽可能做到合理使用API和高效优化SQL查询,以免出现效率和内存问题。

个人思考:

需求在实现之前应该详细分析,找到最优解,如手续费账单分页查询需求如不考虑分页方式时可能会在后续应用时造成效率和内存问题。即便选择了使用逻辑查询,也可以再分析下不同分页插件的使用方案,或者采用分片分页等更合适的策略来调整查询效率。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis和MyBatis-Plus都可以实现分页,但它们的实现方式有所不同。 1. MyBatis分页实现方式 MyBatis分页的实现方式是通过在SQL语句中添加limit关键字控制返回结果的数量。例如: ``` SELECT * FROM user LIMIT 0,10 ``` 这条SQL语句的意思是从user表中返回第1行到第10行的数据。 在MyBatis中,通过PageHelper插件可以方便地实现分页功能。需要在查询语句执行前调用PageHelper.startPage()方法,设置要查询的页码和每页的数据条数。例如: ``` PageHelper.startPage(1, 10); List<User> userList = userDao.selectAll(); ``` 这条代码的意思是查询第1页,每页返回10条数据。 2. MyBatis-Plus分页实现方式 MyBatis-Plus分页的实现方式是通过Page类和PageHelper类实现的。Page类是一个分页对象,用于存储分页的相关信息,如当前页码、每页的数据条数、总数据量等。PageHelper类则是一个分页辅助类,用于在查询语句执行前设置分页参数。 在MyBatis-Plus中,需要先创建一个Page对象,然后在查询语句执行前调用PageHelper类的方法设置分页参数。例如: ``` Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, null); ``` 这条代码的意思是查询第1页,每页返回10条数据。 总之,MyBatis和MyBatis-Plus都可以实现分页,只是实现方式略有不同。MyBatis通过在SQL语句中添加limit关键字实现分页,而MyBatis-Plus则是通过Page类和PageHelper类实现的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值