传统的分页,是基于offset进行分页,如果页码数很大的情况下,每次都需要遍历之前的offset+N条数据,
在分页多的时候容易出现MySQL性能瓶颈,所以我们可以基于取前一页的最大行数的id(将上次遍历到的最末尾的数据ID传给数据库,然后直接定位到该ID处,再往后面遍历数据)
然后根据这个最大的id来限制下一页的起点
- 这也是一种常见的MySQL优化手段
代码如下
public IPage<User> getUsersByPage(int pageNum, int pageSize) {
Long startId = getStartIdByPage(pageNum, pageSize);
if (startId == null) {
// 如果起始ID为null,说明没有数据,返回空分页
return new Page<>(pageNum, pageSize, 0);
}
return getUsersAfterId(startId, pageSize);
}
public Long getStartIdByPage(int pageNum, int pageSize) {
// 查询第(pageNum - 1) * pageSize条记录的最后一个主键ID
int offset = (pageNum - 1) * pageSize;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("id").last("LIMIT " + offset + ", 1");
User user = userMapper.selectOne(queryWrapper);
return user != null ? user.getId() : null;
}
public IPage<User> getUsersAfterId(Long startId, int limit) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("id", startId - 1);
Page<User> page = new Page<>(1, limit);
return userMapper.selectPage(page, queryWrapper);
}
标签:queryWrapper,高效,pageNum,分页,pageSize,int,如何,startId
From: https://www.cnblogs.com/zhangyf1121/p/18276774