Spring Boot分页查询MySQL用户数据出现条目跳过与重复问题
故障原因
- 核心问题为排序规则不稳定、不唯一:当前仅使用布尔类型的
isBoard作为唯一排序字段,该字段只有true和false两种取值,大量用户的isBoard字段值完全一致。MySQL对于排序值相同的行不会固定返回顺序,在数据量较大、存在数据增删或者缓存刷新的场景下,每次分页查询时同分组内的行返回顺序可能随机变化,导致分页偏移量计算出现错位,最终出现数据重复、部分用户被遗漏的问题。
修复方案
- 补充唯一排序维度,保证排序规则全局固定:在
isBoard字段排序之后,新增第二个排序字段,可选择全局唯一、值不会变更的自增主键id,确保相同isBoard取值的用户排序顺序永远固定,不会出现分页错位。
修改分页构造代码如下:
// 原逻辑仅按isBoard排序,修改为按isBoard降序+id升序双维度排序 Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "isBoard").and(Sort.by(Sort.Direction.ASC, "id")));
- (可选优化)如果后续数据量增长到百万级以上,可以将偏移分页替换为游标分页,每次查询携带上一页最后一条数据的
isBoard值和id作为过滤条件,避免大偏移量查询带来的性能损耗,进一步提升分页稳定性。
内容的提问来源于stack exchange,提问作者Kousayla
相关产品推荐
相关产品推荐

