- 文档首页
云数据库 MySQL 版
内核功能
性能
分页查询性能优化
分页查询性能优化
本文介绍云数据库 MySQL 版提供的分页查询性能优化功能的相关信息。
背景信息
在社区版 MySQL 的实现里,limit 和 offset 是在 SQL 层完成处理的。对于以下查询,存储引擎会至少返回 10000010 行,随后在 SQL 层将返回的第 10000001 至 10000010 行数据作为结果返回。
limit 和 offset 通常会在分页场景中一同使用。在分页场景,尤其是深分页场景(即 offset 跳过的行数远多于 limit 保留的行数)下,过滤被 offset 跳过的行的速度对查询的整体性能有显著影响。
云数据库 MySQL 版针对此场景进行了优化,将 limit 和 offset 直接下推至存储引擎。一方面,这能够显著减少存储引擎与 SQL 层之间的交互;另一方面,若存储引擎通过二级索引扫描数据,在将 limit 和 offset 下推之后,还能够大幅减少回表次数。
支持版本
- MySQL 5.7 版本,且内核小版本为 MySQL 5.7.32_20250615 及以上。
- MySQL 8.0 版本,且内核小版本为 MySQL 8.0.32_20250415 及以上。
- MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。
使用说明
修改 loose_limit_offset_pushdown_threshold 参数的运行值为非 -1 的值,即可开启分页查询性能优化特性。
使用示例
- 示例 1:简单的 limit + offset 查询。
- 示例 2:包含 where 条件的 limit + offset 查询,要求 where 条件能够完全下推。
- 示例 3:包含 order by 的 limit + offset 查询,要求存在 order by 列相关的索引,且查询计划中使用了该索引。
- 可以通过 EXPLAIN 语句查看一个 SQL 是否会进行分页查询性能优化。
- 上述语句可以进行优化,输出如下(Using pushed limit offset 表示进行了分页查询性能优化):
-
性能测试
测试环境为 MySQL 8.0 版本,实例规格为独享型 4C16G,创建 20000000 行的 sysbench 表,开启该特性前后分别执行上述的示例 1~3,执行耗时如下:
最近更新时间:2026.05.28 11:52:21