千万级以上数据怎么实现分组分页(类似百度谷歌的分页)

百万数据以上分页的Skip偏移量会导致查询速度骤降!
我在网上看到的解决办法大多都是放弃偏移用边界条件(大于某个ID)limit进行查询,这种做无限加载还行,无法做到分页效果.
有一种思路是用分组分页边界条件加少量偏移实现分页:
    每10个页为一组,查询只需要用这一组的起始边界ID(大于ID) 然后偏移Skip最多(10* pageSize)少量的偏移即可查询出数据.
    问题是我要怎么得到这个边界ID,如果是递进翻页还行,在组内的最后一页时获取到最后一个数据ID,就可以当成下一组的边界起始ID.
    但如果是跳转指定页面,例如从9页(第一组)直接跳到12页(第二组),这时候第一组的边界ID还没获得?
    而且每组的边界ID怎么复用(redis存储,边界ID还会跟随查询条件变化)?
    前台页码展示的实现?
搜了很多都没有一个比较完整的解决方案,自己梳理的比较模糊,希望听听大家的想法

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
JaguarJack
最佳答案

鱼与熊掌不可兼得

2年前 评论
讨论数量: 25

用es会好点 纯数据库的话没啥好的法子

2年前 评论
Asuna (楼主) 2年前
kis龍 2年前
aab 2年前

要不你就限制掉跳转 只给上一页跟下一页

2年前 评论

千万 没啥问题哈

2年前 评论
Asuna (楼主) 2年前
Smilephp (作者) 2年前
Asuna (楼主) 2年前
Smilephp (作者) 2年前

我有一个比较粗暴的法子,就是每次查询的条件和对应数据的ID缓存起来(千万级结果的话就存在数据库中),每次翻页请求就去对这些ID进行查询,再用这些ID去数据库查;

num ID condition_hash
1 335 hash('查询条件1')
2 1145 hash('查询条件1')
3 457 hash('查询条件1')
4 344 hash('查询条件1')
5 55 hash('查询条件1')
1 789 hash('查询条件2')
2 6788 hash('查询条件2')

下次翻页请求来了就直接查 where condition_hash = hash('查询条件1') AND num IN (3,4),拿到ID后再去查原始表

2年前 评论
Asuna (楼主) 2年前
Lu_Shangyu (作者) 2年前
Asuna (楼主) 2年前
Lu_Shangyu (作者) 2年前

不知道你用的版本是 Laravel 多少,可以看一下「游标分页」,参考一下源码实现

分页《Laravel 9 中文文档》

2年前 评论
Asuna (楼主) 2年前
JeffreyBool 2年前
JaguarJack

鱼与熊掌不可兼得

2年前 评论

看了下百度,也不能随便跳到那一页啊 最多5页一跳,url好像有加密,直接改页码参数也不行

2年前 评论
小白菜 1年前

我有个疑问,都是大数据了,你到底要分页查啥啊?你看的过来吗,还跳页,你想看啥!

1年前 评论
Asuna (楼主) 1年前

同样遇到了这个问题,不知道有没有解决掉这个问题。

1年前 评论

组的页码,是否由后端控制?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!