很多从MySQL过来的同学习惯写LIMIT 100000, 20 ,在OB里这么写,翻到第5000页直接超时——这是分布式数据库最典型的新手病。
实测数据 (5000万表,过滤后200万行):
-
LIMIT 10000, 20:8.2秒 -
LIMIT 100000, 20:45.6秒
三种优化方案:
方案一:游标分页(推荐瀑布流场景)
sql
– 第一页 SELECT * FROM orders WHERE status=‘COMPLETED’ ORDER BY id LIMIT 20; – 第二页 SELECT * FROM orders WHERE status=‘COMPLETED’ AND id > 10086 ORDER BY id LIMIT 20;
性能:稳定10ms以内,无论翻到多少页。
方案二:覆盖索引+延迟关联(推荐后台跳页场景)
sql
– 先查主键(只扫索引,不回表) SELECT id FROM orders WHERE status=‘COMPLETED’ ORDER BY create_time LIMIT 100000, 20; – 再用20个id回表 SELECT * FROM orders WHERE id IN (上一步的20个id) ORDER BY create_time;
实测:offset=100000时仅0.11秒,性能提升450倍。
方案三:分区裁剪(OB独家优化)
如果按时间分区且查询带时间范围,确保ob_enable_partition_pruning=ON ,OB只扫描命中分区。
选型速查 :
- App下拉加载 → 游标分页
- 后台跳页 → 延迟关联
- 时间范围查询 → 分区裁剪+游标
【标签】 #分页查询 #SQL优化 #性能调优 #索引设计