上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB( 二 )

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

上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB

文章插图
 
方案基本类似 , 基本代码如下:
上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB

文章插图
 
相关性能测试:
上亿数据怎么玩深度分页?兼容MySQL + ES + 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时 , 也可以采用一样的办法:
  1. 限制获取的字段 , 只通过筛选条件 , 深度分页获取主键ID
  2. 通过主键ID定向查询需要的数据
瑕疵:当偏移量非常大时 , 耗时较长 , 如文中的 5s

作者:Kerwin_
原文链接:https://juejin.im/post/5f0de4d06fb9a07e8a19a641

【上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB】


推荐阅读