单表5000万,翻页从45秒到0.1秒——OceanBase分页查询优化实战

很多从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优化 #性能调优 #索引设计

6 个赞

学习了,谢谢楼主分享

3 个赞

学习了

2 个赞

谢谢分享!都是经验啊!

2 个赞

太棒了

2 个赞

希望对你有帮助

1 个赞

感谢

2 个赞

谢谢分享!

2 个赞

加油,:beers:

1 个赞

学习到了,遇到过这个场景,下次试一试

1 个赞