MySQL原分页SQL:
# 第一页SELECT * FROM `year_score` where `year` = 2017 ORDER BY id limit 0, 20;# 第N页SELECT * FROM `year_score` where `year` = 2017 ORDER BY id limit (N - 1) * 20, 20; 通过上下文关系 , 改写为:
# XXXX 代表已知的数据SELECT * FROM `year_score` where `year` = 2017 and id > XXXX ORDER BY id limit 20;在 没内鬼 , 来点干货!SQL优化和诊断 一文中提到过 , LIMIT会在满足条件下停止查询 , 因此该方案的扫描总量会急剧减少 , 效率提升Max!
ES方案和MySQL相同 , 此时我们就可以随心所欲的使用 FROM-TO Api , 而且不用考虑最大限制的问题 。
MongoDB

文章插图
方案基本类似 , 基本代码如下:

文章插图
相关性能测试:

文章插图
如果非要深度随机跳页如果你没有杠过产品经理 , 又该怎么办呢 , 没关系 , 还有一丝丝的机会 。
在 SQL优化 一文中还提到过MySQL深度分页的处理技巧 , 代码如下:
# 反例(耗时129.570s)select * from task_result LIMIT 20000000, 10;# 正例(耗时5.114s)SELECT a.* FROM task_result a, (select id from task_result LIMIT 20000000, 10) b where a.id = b.id;# 说明# task_result表为生产环境的一个表 , 总数据量为3400万 , id为主键 , 偏移量达到2000万该方案的核心逻辑即基于聚簇索引 , 在不通过回表的情况下 , 快速拿到指定偏移量数据的主键ID , 然后利用聚簇索引进行回表查询 , 此时总量仅为10条 , 效率很高 。因此我们在处理MySQL , ES , MongoDB时 , 也可以采用一样的办法:
- 限制获取的字段 , 只通过筛选条件 , 深度分页获取主键ID
- 通过主键ID定向查询需要的数据
作者:Kerwin_
原文链接:https://juejin.im/post/5f0de4d06fb9a07e8a19a641
【上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB】
推荐阅读
- 技术分享 | 如何优雅地在 Windows 上从 MySQL 5.6 升级到 5.7
- 广西春茶全面采摘上市,莆田春茶提前上市
- 淘宝的淘小蜜在哪里 淘宝上的小蜜是商家吗?
- 高档茶冷了亲民茶热了,迷你小金沱上市了
- 淘宝上传清关资料在哪里 淘宝清关信息在哪设置
- HDMI 2.0已淘汰!HDMI 2.1上位:一文看懂新接口优势
- 用户中心,1亿数据,架构如何设计?
- 世界上已知最大的蛇是什么?
- 数据平台的4个阶段:从数据库到数仓再到中台,超详细的架构全解
- 军事智能化之机器学习《清明上河图》里几个人几个牲口一览无余
