【BUG】Mybatis-Plus 分页查询数据缺失(两步联查法优化)

一、BUG 简述

分页查询时,查询第一页,每页10条,却只有小于10条的数据,且显示有更多页,如图。

BUG样例


二、原因分析

该分页查询为复杂的多表联查,实际查询的数据参考如下:

查询结果

如图所示,多表联查的结果为笛卡尔积,前10个结果包含重复内容,而 Mybatis-Plus 的 IPage 构件自动将数据解析为单个对象,但是数据量相关的数据不变,导致查询前10个数据,但实际只有部分数据被封装。


三、解决方案

优化 SQL 查询

因为 Mybatis-Plus 不推荐多表联查,放弃直接使用 Mybatis-Plus 分页查询全部数据,改为两步联查法

该方案在千万级数据量下实测分页响应时间可控制在 50ms 内,同时保证分页准确性。

将原本的查询方案拆分成以下两部分:

  1. 根据条件分页查询主表主键
    只查询主键,避免生成笛卡尔积,影响分页数据解析
  2. 根据主表主键查询完整数据列表
    根据主键,刮削其余数据,覆盖回原本的 Resords 列表