前面我们提到过,大数据量分页时,skip如果跳过大量的数据会很慢,这里针对这一情况,我们优化一下分页。

看代码:

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
/**
     * 大数据量数据分页优化
     * @param page
     * @param pageSize
     * @param lastId 上一页的最大id
     * @return
     */
    public List<User> largePageList(int page, int pageSize, int lastId) {
        DB myMongo = MongoManager.getDB("myMongo");
        DBCollection userCollection = myMongo.getCollection("user");
        DBCursor limit = null;
        if (page == 1) {
            limit = userCollection.find()
       .sort(new BasicDBObject("id", 1)).limit(pageSize);
        } else {
            limit = userCollection
       .find(new BasicDBObject("id", new BasicDBObject(
               QueryOperators.GT, lastId)))
       .sort(new BasicDBObject("id", 1)).limit(pageSize);
        }

        List<User> userList = new ArrayList<User>();
        while (limit.hasNext()) {
            User user = new User();
            user.parse(limit.next());
            userList.add(user);
        }
        return userList;
    }
    
    
    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        List<User> largePageList = userDao.largePageList(1,5,0);//第一页
        print(largePageList);
        System.out.println("============");
        List<User> largePageList2 = userDao.largePageList(2,5,5);//第二页   需要记录上一页的最大id
        print(largePageList2);
        System.out.println("============");
        List<User> largePageList3 = userDao.largePageList(3,5,11);//第三页   需要记录上一页的最大id
        print(largePageList3);
    }
    
    public static void print(List<User> largePageList){
        for(User user : largePageList){
            System.out.println(user);
        }
    }

输出结果如下:

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14
id:1,name:jinhui,address:beijing
id:2,name:manman,address:beijing
id:3,name:3,address:3
id:4,name:4,address:4
id:5,name:5,address:5
============
id:6,name:6,address:6
id:7,name:7,address:7
id:8,name:8,address:8
id:9,name:9,address:9
id:11,name:11,address:11
============
id:12,name:12,address:12

我们依靠记录排序,记录下上一页排序列的最大值,来进行下一次分页。从而避免了使用skip操作。

原文地址:https://blog.csdn.net/maosijunzi/article/details/42101041?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168904459216782425198141%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168904459216782425198141&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-6-42101041-null-null.142^v88^control,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96