如何高效分页

传统的分页,是基于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);
    }
posted @   zhangyf1121  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示