使用分页查询获取全量数据遇到的问题
问题
在数据库中进行 count 数据量是4050,但是在代码中通过分页查询进行统计之后的总量虽然是 4050,但是去重之后不到 4050。
select count(*) from `recording_score_task` where `business_type` = 22 and create_dt > '2025-04-07 07:00:59'
代码中的 sql 如下
<select id="search" resultMap="BaseResultMap" flushCache="true">
select <include refid="Base_Column_List"></include>
from recording_score_task <include refid="Search_Where"></include>
order by create_dt desc
</select>
问题就出现在order by create_dt,因为在数据库中同一秒中存在的数据时有多条,每次查询返回的数据顺序是不固定的。举个例子:
创建时间在 2025-04-09 11:20:20 的记录假设有两条,表中的数据如下:
| taskNo | create_dt |
|---|---|
| T123 | 2025-04-09 11:20:18 |
| T124 | 2025-04-09 11:20:19 |
| T125 | 2025-04-09 11:20:20 |
| T126 | 2025-04-09 11:20:20 |
下面进行第一次查询,pageSize = 3,pageIndex = 1。结果如下:
| taskNo | create_dt |
|---|---|
| T123 | 2025-04-09 11:20:18 |
| T124 | 2025-04-09 11:20:19 |
| T125 | 2025-04-09 11:20:20 |
接着进行第二次查询,pageSize = 3,pageIndex = 2。结果如下:
| taskNo | create_dt |
|---|---|
| T125 | 2025-04-09 11:20:20 |
可以看到,有可能 T126这条记录没有搜索出来。但是两次查询的总记录数跟数据库中的记录数是一致的。这种情况就会对我们的业务产生影响。
解决方案
当使用分页进行汇总所有数据时,需要使用order by id进行排序,或者分页参数的 pageSize使用一个比较大的数字,比如 Integer.MAX_VALUE