上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
面试题 & 真实经历 面试题 :在数据量很大的情况下,怎么实现深度分页? 大家在面试时,或者准备面试中可能会遇到上述的问题,大多的回答基本上是 分库分表建索引 ,这是一种很 标准的正确回答 ,但现实总是很骨感,所以面试官一般会追问你一句, 现在工期不足,人员不足,该怎么实现深度分页? 这个时候没有实际经验的同学基本麻爪,So,请听我娓娓道来。 惨痛的教训 首先必须明确一点 :深度分页可以做,但是 深度随机跳页绝对需要禁止。 上一张图: 你们猜,我点一下第 142360 页,服务会不会爆炸? 像 MySQL , MongoDB 数据库还好,本身就是专业的数据库,处理的不好,最多就是慢,但如果涉及到 ES ,性质就不一样了,我们不得不利用 SearchAfter Api,去循环获取数据,这就牵扯到内存占用的问题,如果当时代码写的不优雅,直接就可能导致内存溢出。 为什么不能允许随机深度跳页 从技术的角度浅显的聊一聊为什么不能允许随机深度跳页,或者说为什么不建议深度分页 MySQL 分页的基本原理: SELECT * FROM test ORDER BY id DESC LIMIT 10000, 20; LIMIT 10000 , 20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行。如果是LIMIT 1000000 , 100,需要扫描1000100 行