短视频直播系统,优化深度分页问题的实战经验
短视频直播系统,优化深度分页问题的实战经验
适用场景:支持连续分页(如无限滚动)。
实现原理:基于有序且唯一的字段(如自增主键 ID),通过记录上一页最后一条记录的标识(如主键 ID),将WHERE条件与索引结合,跳过已查询数据。
-- 第一页 SELECT * FROM orders WhERE user_id = 'Chaya' ORDER BY create_time DESC LIMIT 20; -- 后续页(记录上一页查询得到的 id,id=1000) SELECT id, user_id, amount FROM orders WHERE id > 1000 AND user_id = 'Chaya' ORDER BY create_time DESC LIMIT 20;
索引树直接定位到order_id=1000的叶子节点,仅扫描后续 1000 条记录,避免遍历前 100 万行数据。
优势
1、完全避免 OFFSET扫描,时间复杂度从 O(N)降为 O(1)
2、天然支持顺序分页场景(如无限滚动加载)
限制
1、不支持随机跳页(如直接跳转到第 1000 页)
2、需保证排序字段唯一且有序
实现原理:通过子查询先获取主键范围,再关联主表获取完整数据。减少回表次数,利用覆盖索引优化性能。
SELECT t1.* FROM orders t1 INNER JOIN ( SELECT id FROM orders WhERE user_id = 'Chaya' ORDER BY create_time DESC LIMIT 1000000, 20 ) t2 ON t1.id = t2.id;
优势
1、子查询仅扫描索引树,避免回表开销。
2、主查询通过主键精确匹配,效率极高。
3、性能提升可达 10 倍以上(实测从 1.2 秒降至 0.05 秒)。
实现原理:创建包含查询字段的联合索引,避免回表操作。例如索引设计为(user_id, id, create_time, amount)。
ALTER TABLE orders ADD INDEX idx_cover (user_id, id, create_time,amount); SELECT id, user_id, amount, create_time FROM orders USE INDEX (idx_cover) WhERE user_id = 'Chaya' ORDER BY create_time DESC LIMIT 1000000, 20;
Chaya:订单很多字段的,我想查看更多订单细节怎么办?
这个问题问得好,我们可以设计订单列表和详情页,通过上述方案做订单列表的分页查询;点击详情页的时候,在使用订单 id 查询订单。
实现原理:将大表按时间或哈希值水平拆分。例如按月分区,每个分区独立存储,缩小扫描范围。
-- 按月份RANGE分区 ALTER TABLE orders PARTITION BY RANGE (YEAR(create_time)*100 + MONTH(create_time)) ( PARTITION p202501 VALUES LESS THAN (202502), PARTITION p202502 VALUES LESS THAN (202503) ); -- 查询特定月份数据 SELECT * FROM orders PARTITION (p202501) WHERE user_id = 'chaya' ORDER BY create_time DESC LIMIT 20;
实现原理:通过异步任务预生成分页数据,存储到 Redis 或物化视图。适合数据更新频率低的场景。
实现步骤
1、定时任务生成热点页数据。
2、存储到 Redis 有序集合。
ZADD order_pages 0 "page1_data" 1000 "page2_data"
查询的时候直接获取缓存数据
-- 伪代码:获取第N页缓存 ZRANGEBYSCORE order_pages (N-1)*1000 N*1000
实现原理:利用 ES 的search_after特性,通过游标实现深度分页。结合数据同步工具保证一致性。
实现流程:canal+kafka 订阅 MySQL binlog 将数据异构到 elasticsearch。
elasticsearch 保存的数据主要就是我们的查询条件和订单 id。
订单表 → Binlog → Canal → Kafka → Elasticsearch、Hbase
在查询的时候,通过 Elasticsearch 查询得到订单 ID,最后在根据订单 ID 去 MySQL 查询。
或者我们可把数据全量同步到 Hbase 中查询,在 Hbase 中查询完整的数据。
以上就是短视频直播系统,优化深度分页问题的实战经验, 更多内容欢迎关注之后的文章