浅析分批分页查询场景及方案

发布时间:2026/11/3 1:12:47

浅析分批分页查询场景及方案 背景在日常开发中不可避免的要用到分批查询或分页查询其中的场景有很多有的是WEB页面的分页查询效果或移动端向下滑动的分页查询有的则是因为目标数据量巨大不得已而分批查询。无论是出于性能考虑还是大报文考虑抑或页面的效果分批或分页查询都是研发的日常。本文尝试对日常项目用到的分批分页查询做一下方案的回顾和浅析。查询场景及方案一、普通分批分页查询场景方案1 普通LIMIT OFFSET分页查询方式通过数据库直接LIMIT OFFSET 的方式是最简单也是最常用的分页查询方式。SELECT id, warehouse_no, location_no, sku, sku_level, lot_no, pack_code, owner_no, extend_content FROM st_stock WHERE deleted 0 AND warehouse_no 6_666 ORDER BY id ASC LIMIT 100,10该方法直接简单开发和运维简单可读性高但当offset值偏移量非常大时弊端也比较明显深分页性能问题比较严重例如 LIMIT 1000000, 10 。当执行LIMIT 1000000, 10时SQL的处理流程是扫描并读取前1,000,000条记录丢弃这1,000,000条记录返回接下来的10条记录这意味着即使只需要10条数据数据库也必须访问和处理大量的无用数据。简言之深分页IO开销大需要读取大量无用数据页内存消耗高大量数据加载到内存后被丢弃CPU消耗高排序、过滤操作消耗大量CPU资源。方案2 基于子查询或二次查询的分页查询SELECT s.id, warehouse_no, location_no, sku, sku_level, lot_no, pack_code, owner_no, extend_content FROM st_stock s JOIN ( SELECT id FROM st_stock WHERE deleted 0 AND warehouse_no 6_666 ORDER BY id ASC LIMIT 100,10 ) s2 ON s.id s2.id或SELECT s.id, s.warehouse_no, s.location_no, s.sku, s.sku_level, s.lot_no, s.pack_code, s.owner_no, s.extend_content FROM st_stock s WHERE EXISTS ( SELECT 1 FROM ( SELECT id FROM st_stock WHERE deleted 0 AND warehouse_no 6_666 ORDER BY id ASC LIMIT 100,10 ) AS s2 WHERE s.id s2.id );除了直接在SQL中进行分页处理还可以通过二次查询的方式来实现。第一步先分页查询id列表SELECT id FROM st_stock WHERE deleted 0 AND warehouse_no 6_666 ORDER BY id ASC LIMIT 100,10;id字段有主键索引避免回表。第二步以第一步的id列表作为in条件查询库存信息。SELECT id, warehouse_no, location_no, sku, sku_level, lot_no, pack_code, owner_no, extend_content FROM st_stock WHERE id IN (id1, id2, id3, ...);注意下面的SQL方式是错误的SQL语法不支持SELECT id, warehouse_no, location_no, sku, sku_level, lot_no, pack_code, owner_no, extend_content FROM st_stock s where id in ( SELECT id FROM st_stock WHERE deleted 0 AND warehouse_no 6_666 ORDER BY id ASC LIMIT 100,10 )SQL 错误 [1235] [42000]: This version of SQL doesnt yet support LIMIT IN/ALL/ANY/SOME subquery解决方案就是使用上面的方式实现。方案3 游标分页滚动式查询SELECT id, warehouse_no, location_no, sku, sku_level, lot_no, pack_code, owner_no, extend_content FROM st_stock WHERE deleted 0 AND warehouse_no 6_666 AND id 100 ORDER BY id ASC LIMIT 10与方案一相比最大的区别是增加了id条件本次id的条件是上一次查询结果集中的最大id通过id滚动式查询缩小检索范围。上图就是一个游标分页查询的案例。二、动态数据分批分页导出查询场景对于动态变化的数据想要分批分页导出而且想要保证数据的准确性该如何处理呢方案1 对目标数据加锁将导出条件对应的目标数据锁定导出结束后再解锁这批数据。导出时间被锁定的数据行不能update、delete可以select。优势•可以保持在导出期间稳定导出数据减少因为数据的动态变化影响数据的准确性。•如果在导出期间符合条件的数据库行有新增insert在数据库主键ID递增的情况下新增行的id更大排序在后可以正常导出这部分新增数据不受影响。劣势•锁定的这部分导出数据在导出期间只读不能执行写服务相当于停产导出适合于生产低谷时段或停产时段进行导出。方案2 生成导出数据快照将导出条件对应的目标数据生成导出库存快照数据导出执行是将本次版本的快照数据导出导出数据快照过时可以清理。实时数据快照数据优势•在数据导出期间稳定导出数据每次导出的数据都有单独的导出数据快照版本导出期间数据的准确性得到保障。•在数据导出期间即使有数据的变化也不影响导出效果。不锁数据行不影响生成生产作业。劣势•如果在导出期间符合条件的数据库行有新增insert这部分数据即使符合导出条件也不会导出因为这部分新增的数据在导出数据快照之后生成并未在快照数据中。•需要生成导出数据快照导出数据快照版本需要单独的库表存储同时也会占用磁盘资源。•导出数据快照生成期间倘若符合条件的数据行有变化需要对快照数据生成特殊处理比如一次性生成快照等方式。三、内存分页查询场景在日常研发过程中遇到的分页查询大部分都可以借助SQL数据库、ES等存储中间件自身的分页功能实现但个别场景下并不符合比如数据并未存储在SQL数据库或ES中而是内存计算出来的一种结果数据或者数据库中存储的数据维度并不符合并不能通过简单的GROUP BY等方式实现维度加工或者数据库中存储的数据需要通过第三方RPC远程接口实时获取特殊属性打标过滤后才可以作为目标数据使用。在这些场景下我们会用到内存分页的方式处理。内存分页方案上面的示例是一个简单的内存分页处理方式。总结本文回顾了日常研发过程中经常遇到的普通分批分页查询场景、动态数据分批分页导出查询场景、内存分页查询等场景探讨了对应的解决方案。方案并非固定一成不变的也有各自的利弊和局限性在合适场景下选择合适的方案即可。
延伸阅读

更多相关文章

2026/10/28 6:03:01

Linux CGroups资源控制实战指南

1. Linux CGroups 资源控制实战概述在Linux系统中,资源管理一直是个核心课题。记得我第一次在生产环境遇到资源争用问题时,整台服务器的CPU被某个跑偏的进程吃满,导致关键服务不可用。那时候只能简单粗暴地用kill解决问题,直到发现…

2026/11/2 15:58:35

C# 两个凸多边形之间的切线(Tangents between two Convex Polygons)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 给定两个凸多边形,我们的目标是找出连接它们的下切线和上切线。 如下图所示,T RL和T LR分别代表上切线和下切线。 例如: 输入&#xff1…

2026/10/30 11:27:29

ADC 采样数据乱跳?分享我用了多年的滤波函数

简介ADC采集数据我们项目开发中经常用到,那么你是如何处理采集到的数据的呢?说实话我看到有部分同学直接拿来使用的,这样数据一旦飘逸那就是不稳定因素,有很大的潜在风险,下面介绍一下我用过的处理方式,欢迎…

2026/11/3 1:09:48

工业级隔离SPI链路设计:MAX14431BAEE+与TM4C129ENCPDT实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:09:48

ODrive固件移植FreeRTOS实战:从超级循环到实时任务调度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:09:48

工业SPI隔离通信实战:MAX14431与TM4C129的稳定链路设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:09:48

工业SPI隔离实战:MAX14431BAEE+与STM32G431RB全流程设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:09:48

工业级隔离SPI链路设计:MAX14431与MKV44F256实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

I2C协议核心机制解析:多主机仲裁与时钟延展的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑