海量数据分页查询效率低?一文解析阿里云AnalyticDB深分页优化方案

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 本文介绍了AnalyticDB(简称ADB)针对深分页问题的优化方案。深分页是指从海量数据中获取靠后页码的数据,常导致性能下降。ADB通过快照缓存技术解决此问题:首次查询生成结果集快照并缓存,后续分页请求直接读取缓存数据。该方案在数据导出、全量结果分页展示及业务报表并发控制等场景下表现出色。测试结果显示,相比普通分页查询,开启深分页优化后查询RT提升102倍,CPU使用率显著降低,峰值内存减少至原方案的几分之一。实际应用中,某互联网金融客户典型慢查询从30秒优化至0.5秒,性能提升60+倍。

640 (1).gif

1.背景

在企业的实际应用中,深分页是一种常见的高成本查询场景,通常指用户需要从海量数据结果集中获取靠后页码(如1000页之后)的数据,随之而来的是I/O开销激增、查询延迟显著上升等性能问题。比如在电商商品查找场景中,通常按销量、评分等排序,使用户能快速找到优质商品。为避免一次性加载过多数据导致卡顿,应用端常采用分页展示。

常规做法是按照所需列进行排序后利用 limit + offset 实现,这样的查询称为分页查询,其中 limit 为每页需要展示的数据条数,offset 为每页数据的起始偏移。若系统每页展示 100 条数据,那么查询第 1 页的 SQL 为:

SELECT * FROM t_order ORDER BY id LIMIT 0, 100

查询第 10001 页的 SQL 为:

SELECT * FROM t_order ORDER BY id LIMIT 1000000, 100

1.1 什么是深分页问题?

当请求的分页较深时,全局排序开销和频繁的回表开销会导致数据库性能急剧下降,这样的问题称为深分页问题,比如上面例子中查询第 10001 页的数据。

云原生数据仓库AnalyticDB MySQL(以下简称ADB)这样的分布式数据库下会更复杂。为了减少不同节点间 shuffle 的数据量,往往每个 worker (存储数据的节点) 会先在本地做一次 TopN 计算,再由单节点对每个 worker 的执行结果进行聚合,排序后产生最终的结果集返回。


640 (36).png


所以为了保证最终的正确性,需要对 SQL 语句进行改写交给每个 worker 执行。例如,查询第 10001 页,每个 worker 收到的查询为:

SELECT * FROM t_order ORDER BY id LIMIT 0, 1000100

原本只要 100 条数据,最后却要由单节点对 1000100 × worker数 条数据进行全局排序,排序的数据量随分页深度线性增长,性能也会急剧下降。同时不落盘的情况下排序完全基于内存进行,极大增加了 OOM 风险。


1.2 为什么在AnalyticDB使用深分页?

▶︎ 1.2.1 数据导出

在做数据导出时,一次性读取过多数据容易造成客户端不稳定,所以往往会通过分页查询的方式分批拉取结果,这也是在 ADB 深分页的绝大多数场景。

由于在分布式环境下,直接使用 limit offset 的方式并不会保证数据以确定的顺序被处理,意味着同一页数据每次查询时可能会返回不同的结果,所以需要通过显式增加 order by 来保证数据导出时的不重不漏。


▶︎ 1.2.2 全量结果按需(分页)展示

查询的全量结果暂存在ADB服务端,通过分页的方式按需展示。


▶︎ 1.2.3 业务报表并发控制

多个用户并发查询同一张报表时,以往实现的是每个请求都独立发起查询,这样不仅会增加集群负载,还可能导致数据一致性问题。

通过本优化,可以达到一段时间窗口内全局一个query的效果,显著提升查询性能和集群稳定性。


2. AnalyticDB深分页解决方案

2.1 整体方案介绍

从上述场景和用户痛点出发,ADB对深分页进行专项优化,解决深分页查询的性能问题。主要思想是基于快照缓存。首次查询时会生成并缓存查询去掉 limit offset 后的结果集的快照,在元数据表中维护缓存的相关信息,通过 id 标识,以下称为 paging_id。


后续每次分页请求会通过 SQL 计算出 paging_id,找到对应快照数据,批量拉取结果。使用深分页优化后并不保证缓存数据与原始数据的强一致性。


2.2 关键链路

▶︎ 2.2.1 内部转换逻辑

640 (37).png

a. ADB 接收到带深分页优化 hint 的分页查询,解析并进行必要检查(如是否包含 limit offset),若不符合要求则报错。

b. 解析分页SQL,去掉 limit offset 后根据 pattern 计算哈希生成 paging_id,检查元数据表中是否存在对应分页缓存。若无缓存,则进入“创建分页缓存模式”;若有,则进入“查询分页缓存模式”。

c. 创建分页缓存模式:服务端内部会执行分页SQL 去掉外层 limit offset 的部分,并生成数据快照缓存下来,整个过程异步执行,产生的缓存文件会同步到cache file meta表中。

d. 查询分页缓存模式:根据 paging_id 查找分页缓存元数据,检查通过后定位对应缓存文件及所在节点,下发任务读取数据。若数据仍在准备中,查询将进入阻塞。


▶︎ 2.2.2 缓存自动清理逻辑

根据过期时间淘汰:统计的是最后一次被访问的时间间隔,默认为 10 分钟,当某个分页缓存在该时间间隔内没有被访问,则会被自动删除。


▶︎ 2.2.3 设置缓存有效时间

分页缓存支持设置缓存有效时间。超过有效时间后,缓存失效,后续同一Pattern的查询会重新访问数据库查询数据,并更新缓存表,通常应用在报表并发控制场景中。


2.3 优化来源分析

深分页的代价根源是结果集全局排序,ADB 针对这一点进行了优化,以下面简单的例子进行分析:

假设要读取 1-100 页数据,每页有 100 条记录。


普通分页查询


640 (38).png

每次都需要在每个存储数据的节点上查询排在最前面的 offset + 100 条数据,然后由单节点负责收集,将节点数 × (offset + 100) 条数据聚合起来进行一次全局排序,取最终的从 offset 开始的 100 条数据。这个过程中每个worker都要对本地存储的数据进行多次排序计算【如上图红色虚线框所示】,且最后全局排序的数据量与offset线性相关【如上图红色实线框所示】。

开启深分页优化


640 (39).png

创建分页缓存阶段会在每个节点上查询分页SQL 去掉 limit offset 部分的所有数据,后续分页查询会根据 limit 和 offset 按一致的确定顺序读取缓存数据。【数据导出场景示意图如上所示】

相比普通分页查询,开启深分页优化后,对于数据导出场景,会优化掉不必要的 order by,执行效率和资源消耗会大幅降低;对于全量结果按需展示场景,也只存在一次全局排序,且每个分片只查询了一次


3. 深分页优化方案收益(部分结果)

于TPCH 100G对数据导出场景的优化收益进行评估,测试集群包含6个worker,导出数据 100w 条,每页 10w 条数据。

-- 使用普通分页
select * from lineitem order by l_orderkey,l_linenumber limit 0,100000

-- 开启深分页优化
/*paging_cache_enabled=true*/
select * from lineitem limit 0,100000

从查询RT,CPU使用率,查询峰值内存三个维度对比。总体来说:

  • 普通分页查询各个指标都会随着分页深度的增加基本呈线性增长,因为存在一个全局排序,offset 越大,最后全局排序的数据量就越大。
  • 开启深分页优化后,rt只有在缓存生成阶段会有明显延迟,延迟与单个文件大小相关;由于优化掉了 order by,最终的cpu使用率与峰值内存均较低。


▶︎ 查询RT

单并发执行,整个导出过程普通分页查询平均RT为54391ms,开启深分页优化后平均RT在525ms,性能提升102x


640 (40).png


▶︎ CPU使用率

使用普通分页CPU使用率在80%左右;开启深分页优化后,缓存生成过程最大CPU使用率在20%左右,后续分页CPU使用率极低。


▶︎ 峰值内存

使用普通分页峰值内存随着分页深度基本呈线性增长,查询第1页峰值内存为225M,查询第10页峰值内存为14G;开启深分页优化后,峰值内存大大降低,缓存生成过程中内存使用最高,仅为584M


4. 总结

AnalyticDB深分页产品化解决方案,从用户痛点出发,相较于普通的分页查询,我们做到了:

  • 在数据导出场景下脱掉了不必要的order by,解决利用深分页导出时的 OOM 问题。
  • 在分页展示场景下通过缓存快照,保证了只存在一次全局排序,且每个分片只查询了一次,提升查询性能。

同时也保证了功能的易用性,用户可以无感使用深分页优化,目前在某互联网金融客户场景中,将典型的慢查询从30s优化至0.5s,性能提升60+倍。后续也会持续对功能进行打磨,提升产品使用体验,敬请期待。

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
25天前
|
监控 Java 测试技术
2025 年 Java 核心技术从入门到精通实战指南
《2025年Java核心技术实战指南》全面覆盖Java开发的最新趋势与最佳实践。内容包括Java新特性(如模式匹配、文本块、记录类)、微服务架构(Spring Boot 3.0+、Spring Cloud)、响应式编程(Reactor、WebFlux)、容器化与云原生(Docker、Kubernetes)、数据访问技术(JPA、R2DBC)、函数式编程、单元测试与集成测试(JUnit 5、Mockito)、性能优化与监控等。通过实战案例,帮助开发者掌握构建高性能、高可用系统的技能。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
110 7
|
26天前
|
人工智能 OLAP 数据处理
解锁数仓内AI流水线,AnalyticDB Ray基于多模ETL+ML提效开发与运维
AnalyticDB Ray 是AnalyticDB MySQL 推出的全托管Ray服务,基于开源 Ray 的丰富生态,经过多模态处理、具身智能、搜索推荐、金融风控等场景的锤炼,对Ray内核和服务能力进行了全栈增强。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 常用函数
我们这次全面梳理 MySQL 中的常用函数,涵盖 聚合函数、字符串函数、日期时间函数、数学函数 和 控制流函数 等五大类。每类函数均配有语法说明与实用示例,帮助读者提升数据处理能力,如统计分析、文本处理、日期计算、条件判断等。文章结尾提供了丰富的实战练习,帮助读者巩固和应用函数技巧,是进阶 SQL 编程与数据分析的实用工具手册。
73 2
|
26天前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
136 4
|
存储 人工智能 OLAP
LangChain+通义千问+AnalyticDB向量引擎保姆级教程
本文以构建AIGC落地应用ChatBot和构建AI Agent为例,从代码级别详细分享AI框架LangChain、阿里云通义大模型和AnalyticDB向量引擎的开发经验和最佳实践,给大家快速落地AIGC应用提供参考。
131139 94
|
13天前
|
运维 监控 关系型数据库
AI 时代的 MySQL 数据库运维解决方案
本方案将大模型与MySQL运维深度融合,构建智能诊断、SQL优化与知识更新的自动化系统。通过知识库建设、大模型调用策略、MCP Server开发及监控闭环设计,全面提升数据库运维效率与准确性,实现从人工经验到智能决策的跃迁。
150 26
|
27天前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
136 0
|
6天前
|
数据库 对象存储
2025年 | 7月云大使推广奖励规则
云大使推广返利活动,企业新用户下单返佣加码5%,推广最高返佣45%,新老用户都可参与返利活动。
|
26天前
|
自然语言处理 数据管理 数据库
告别切屏|阿里云DMS MCP+通义灵码30分钟搞定电商秒杀开发
DMS MCP+通义灵码的梦幻组合,标志着研发流程从“工具堆砌”向“智能闭环”的跃迁。通过统一数据管理、自然语言交互与自动化代码生成,开发者可专注于业务创新,而无需被琐碎的数据库操作所束缚。
告别切屏|阿里云DMS MCP+通义灵码30分钟搞定电商秒杀开发

热门文章

最新文章