如何高效分页
传统的分页,是基于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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类