使用分页查询获取全量数据遇到的问题
问题
在数据库中进行 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