0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

京东云 来源:jf_75140285 作者:jf_75140285 2026-04-03 16:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景

在日常开发中,不可避免的要用到分批查询或分页查询,其中的场景有很多,有的是WEB页面的分页查询效果,或移动端向下滑动的分页查询,有的则是因为目标数据量巨大,不得已而分批查询。无论是出于性能考虑,还是大报文考虑,抑或页面的效果,分批或分页查询都是研发的日常。

wKgZPGnPd5CAHOi_AAgCL7I7XRY918.png



wKgZO2nPd5KAP4JmABDolRcxkzw412.png



本文尝试,对日常项目用到的分批分页查询做一下方案的回顾和浅析。

查询场景及方案

一、普通分批分页查询场景

方案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 doesn't 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滚动式查询,缩小检索范围。



wKgZPGnPd5SAa-14AAW7X17KtVE538.png

上图就是一个游标分页查询的案例。



二、动态数据分批分页导出查询场景

对于动态变化的数据,想要分批分页导出,而且想要保证数据的准确性,该如何处理呢?

方案1 对目标数据加锁

将导出条件对应的目标数据锁定,导出结束后再解锁这批数据。导出时间被锁定的数据行,不能update、delete,可以select。

id SKU …… locked
2019609892142206976 123 …… 1
2019695225349345280 456 …… 1
2019326832070885376 789 …… 1
2027414057350348800 110 …… 0
2027414069316685824 118 …… 0



优势

•可以保持在导出期间稳定导出数据,减少因为数据的动态变化影响数据的准确性。

•如果在导出期间,符合条件的数据库行有新增(insert),在数据库主键ID递增的情况下,新增行的id更大,排序在后,可以正常导出这部分新增数据,不受影响。



劣势

•锁定的这部分导出数据,在导出期间,只读,不能执行写服务,相当于停产导出,适合于生产低谷时段或停产时段进行导出。





方案2 生成导出数据快照

将导出条件对应的目标数据生成导出库存快照数据,导出执行是将本次版本的快照数据导出,导出数据快照过时可以清理。

实时数据

id SKU ……
2019609892142206976 123 ……
2019695225349345280 456 ……
2019326832070885376 789 ……
2027414057350348800 110 ……
2027414069316685824 118 ……



快照数据

id SKU ……
2019609892142206976 123 ……
2019695225349345280 456 ……
2019326832070885376 789 ……



优势

•在数据导出期间稳定导出数据,每次导出的数据都有单独的导出数据快照版本,导出期间数据的准确性得到保障。

•在数据导出期间,即使有数据的变化,也不影响导出效果。不锁数据行,不影响生成生产作业。



劣势

•如果在导出期间,符合条件的数据库行有新增(insert),这部分数据即使符合导出条件,也不会导出,因为这部分新增的数据在导出数据快照之后生成,并未在快照数据中。

•需要生成导出数据快照,导出数据快照版本需要单独的库表存储,同时也会占用磁盘资源。

•导出数据快照生成期间,倘若符合条件的数据行有变化,需要对快照数据生成特殊处理,比如一次性生成快照等方式。



三、内存分页查询场景

在日常研发过程中遇到的分页查询,大部分都可以借助SQL数据库、ES等存储中间件自身的分页功能实现,但个别场景下并不符合,比如数据并未存储在SQL数据库或ES中,而是内存计算出来的一种结果数据;或者数据库中存储的数据维度并不符合,并不能通过简单的GROUP BY等方式实现维度加工;或者数据库中存储的数据,需要通过第三方RPC远程接口实时获取特殊属性打标过滤后,才可以作为目标数据使用。

在这些场景下,我们会用到内存分页的方式处理。



内存分页方案

wKgZO2nPd5SACPU-AASGd8cuHl4889.png



wKgZPGnPd5WAANthAAJ10yGnWj8204.png



上面的示例,是一个简单的内存分页处理方式。

总结

本文回顾了日常研发过程中,经常遇到的普通分批分页查询场景、动态数据分批分页导出查询场景、内存分页查询等场景,探讨了对应的解决方案。方案并非固定一成不变的,也有各自的利弊和局限性,在合适场景下,选择合适的方案即可。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 京东
    +关注

    关注

    2

    文章

    1130

    浏览量

    50140
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MySQL慢查询调优指南

    MySQL慢查询是数据库性能问题的最常见原因。当一条SQL语句执行超过1秒时,就可能影响用户体验;超过10秒时,通常会收到用户投诉;而超过30秒的查询,往往意味着系统存在严重的性能问题。本文从实
    的头像 发表于 04-09 10:01 180次阅读

    MySQL数据库慢查询分析与优化实战

    在讨论MySQL慢查询之前,需要先明确一个关键前提:什么是慢查询? 不同业务场景下,慢查询的定义差异巨大。一个数据报表后台的SQL执行30秒可能属于正常范围,但一个订单创建的数据库操作
    的头像 发表于 04-02 09:38 171次阅读

    2026年HUB芯片方案选择洞察:从传输效率到场景适配的专业分析与推荐

    随着Type-C接口普及、高速数据传输需求激增,HUB芯片已成为消费电子、办公设备与工业场景的“连接核心”。对于正处于方案评估阶段的企业或开发者而言,选择一款适配自身场景的HUB芯片,需跳出“只看
    发表于 03-20 18:49

    MUN3CAD03-SF:多场景电源模块替代的优选方案

    MUN3CAD03-SF:多场景电源模块替代的优选方案在电子设计领域,电源模块的选型直接决定系统性能与稳定性,MUN3CAD03-SF作为一款主流DC-DC电源模块,虽具备过流保护(OCP)、过温
    发表于 02-02 09:51

    从0到1搭建实时日志监控系统:基于WebSocket + Elasticsearch的实战方案

    if(this.logs.length>1000)this.logs.pop();// 限制数量 }; 4. 性能优化与坑点 ES查询优化 :使用search_after替代from/size,避免深度分页性能
    发表于 01-09 16:43

    Neway电机方案在电机控制的应用场景

    Neway电机方案在电机控制的应用场景Neway电机方案在电机控制领域的应用场景广泛且效果显著,其核心优势在步进电机、伺服电机控制及CNC机床主轴驱动等
    发表于 01-04 10:10

    微店商品列表API,轻松采集商品列表数据

    微店商品列表API是微店开放平台提供的核心接口,主要用于获取指定店铺的商品列表数据。该接口支持分页查询、条件筛选和排序功能,适用于电商管理系统、竞品分析和多平台展示等场景。 一、接口概述 1.
    的头像 发表于 12-01 14:32 562次阅读

    OBOO鸥柏丨110英寸大屏国产化麒麟系统触摸屏人才市场信息查询

    ,为人才市场招聘查询带来了全新的解决方案。从场景化主体特点来看,人才市场人流量大,招聘信息查询需求高。OBOO鸥柏的这款触摸屏采用110寸卧式设计,符合人体工程学,
    的头像 发表于 11-28 18:40 567次阅读
    OBOO鸥柏丨110英寸大屏国产化麒麟系统触摸屏人才市场信息<b class='flag-5'>查询</b>

    商品类目属性查询接口技术实现详解

    ​   一、接口核心功能 该接口用于查询电商系统中商品类目的属性信息,支持: 按类目ID查询属性集合 按属性类型过滤(关键属性$K$、销售属性$S$、普通属性$N$) 分页返回属性数据 多语言属性名
    的头像 发表于 10-11 15:43 564次阅读
    商品类目属性<b class='flag-5'>查询</b>接口技术实现详解

    别踩分页坑!京东商品详情接口实战指南:从并发优化到数据完整性闭环

    京东商品详情接口(jingdong.ware.get)是电商数据开发的核心难点,本文详解其权限申请、分页优化、多规格递归解析与完整性校验等实战方案,结合代码示例与性能调优参数,助你高效稳定对接,提升数据获取效率2.5倍以上,适用于各类规模店铺的数据需求。
    的头像 发表于 09-30 15:50 1200次阅读

    常用PromQL查询案例总结

    在云原生时代,Prometheus已经成为监控领域的事实标准。作为一名资深运维工程师,我见过太多团队在PromQL查询上踩坑,也见过太多因为监控不到位导致的生产事故。今天分享10个实战中最常用的PromQL查询案例,每一个都是血泪经验的总结。
    的头像 发表于 09-18 14:54 859次阅读

    产品详情查询API接口

    ,使用HTTP协议实现数据传输,支持多种应用场景,包括电商平台、移动应用和数据分析系统。本文将逐步介绍产品详情查询API接口的核心概念、工作原理、实现方法以及实际应用示例,帮助开发者快速上手。 什么是产品详情查询API接口? 产
    的头像 发表于 07-24 14:39 704次阅读
    产品详情<b class='flag-5'>查询</b>API接口

    无硅油与含硅油导热片: 精准匹配不同场景的散热解决方案

    决策:使用含硅油导热片还是无硅油导热片?事实上,这两种材料并非替代关系,而是针对不同应用场景的互补解决方案。理解它们各自的特性和适用领域,能为电子设备散热设计提供更精准的匹配方案。 一、材料特性
    发表于 07-14 17:04

    媒体查询详解

    概述 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(比如
    发表于 06-25 08:26

    同步电机失步浅析

    纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:同步电机失步浅析.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 06-20 17:42