如何在MongoDB中获取限定数量数据 实现传感器海量数据分页查询
10亿级传感器时序数据分页查询实现方案
功能实现逻辑
首先避免使用传统OFFSET分页,10亿级数据下大偏移量查询会扫描大量前置无效数据,性能极差,推荐使用**游标分页(Keyset Pagination)**方案:
get 1(首次查询)逻辑:
直接按时间排序取前1000条,同时记录返回结果中最后一条数据的时间戳(如果存在相同时间戳数据,额外记录最后一条的自增主键ID作为联合游标):
服务端暂存本次返回最后一条的SELECT * FROM sensor_table ORDER BY ts DESC, id DESC LIMIT 1000;last_ts和last_id值。get 2及后续分页查询逻辑:
携带上一页记录的游标值作为过滤条件,无需跳过前置数据,直接定位到下一页起始位置:
查询完成后更新服务端暂存的SELECT * FROM sensor_table WHERE ts < ${last_ts} OR (ts = ${last_ts} AND id < ${last_id}) ORDER BY ts DESC, id DESC LIMIT 1000;last_ts和last_id即可。
性能优化建议
- 索引优化:为
ts + id建立联合聚集索引,所有分页查询可直接走索引无需回表,查询延迟稳定在毫秒级,翻到任意页数性能无衰减。 - 分片优化:10亿级数据建议按时间维度做水平分片,例如按月/周分片,查询时自动路由到对应分片,避免扫描全库数据。
- 存储选型:如果当前使用的是普通关系型数据库,可迁移到时序专用数据库(如TimescaleDB、TDengine、InfluxDB),这类数据库天生针对时序数据排序、分页场景做了底层优化,同等配置下查询性能可提升5~20倍。
单条记录格式参考

内容的提问来源于stack exchange,提问作者The blank
相关产品推荐
相关产品推荐

