【BUG】Mybatis-Plus 分页查询数据缺失(两步联查法优化)
【BUG】Mybatis-Plus 分页查询数据缺失(两步联查法优化)
一、BUG 简述
分页查询时,查询第一页,每页10条,却只有小于10条的数据,且显示有更多页,如图。
二、原因分析
该分页查询为复杂的多表联查,实际查询的数据参考如下:
如图所示,多表联查的结果为笛卡尔积,前10个结果包含重复内容,而 Mybatis-Plus 的 IPage 构件自动将数据解析为单个对象,但是数据量相关的数据不变,导致查询前10个数据,但实际只有部分数据被封装。
三、解决方案
优化 SQL 查询
因为 Mybatis-Plus 不推荐多表联查,放弃直接使用 Mybatis-Plus 分页查询全部数据,改为两步联查法。
该方案在千万级数据量下实测分页响应时间可控制在 50ms 内,同时保证分页准确性。
将原本的查询方案拆分成以下两部分:
- 根据条件分页查询主表主键
只查询主键,避免生成笛卡尔积,影响分页数据解析 - 根据主表主键查询完整数据列表
根据主键,刮削其余数据,覆盖回原本的 Resords 列表
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Amane64!
评论