You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
性能
逻辑预读
复制全文
下载 pdf
逻辑预读
本文介绍云数据库 MySQL 版提供的逻辑预读功能的相关信息。
支持版本
  • MySQL 5.7 版本,且内核小版本为 MySQL 5.7.44_20260215 及以上。
  • MySQL 8.0 版本,且内核小版本为 MySQL 8.0.43_20251215 及以上。
  • MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。
说明
您可通过查看实例信息查看实例的内核小版本。如您实例的内核小版本未在受支持的内核小版本范围内,您可手动升级实例内核小版本
背景信息
MySQL 原生支持线性预读能力,根据物理位置预测需要读取的页并异步加载到 buffer pool 中,使得用户线程后续的读请求可以直接命中 buffer pool,减少用户 SQL 的 IO 时延。但在云盘场景,相邻的数据页可能在实际存储上并不连续,导致 MySQL 原生的线性预读机制对云盘版本的优化效果不佳。
云数据库 MySQL 版引入逻辑预读能力,通过用户 SQL 精准预测需要读取的页,以减少云盘版本 SQL 的 IO 时延。
特性说明
逻辑预读能力通过后台线程扫描索引,根据索引精准预测用户线程需要读取的页,并异步加载到 buffer pool 中。
逻辑预读当前支持以下场景:
  • 主键范围扫描(适用主键索引扫描量大的场景)
  • 二级索引范围扫描(适用二级索引覆盖索引扫描量大的场景)
  • 索引覆盖索引扫描(适用二级索引覆盖索引扫描量大的场景)
  • 二级索引范围扫描回表主键(适用二级索引过滤率差的场景)
为优化 BLOB 数据的读取性能,本次迭代 MySQL 8.0 版本同步实现了 BLOB 对象的预读能力。
使用说明
参数说明
云数据库 MySQL 版提供了以下可修改参数,用于对逻辑预读功能进行设置。
参数名称
支持版本
默认值
是否需要重启实例以生效
取值范围
级别
参数描述
loose_enable_logical_prefetch_page
MySQL 5.7,MySQL 8.0,MySQL 8.4
OFF
[ON|OFF]
GLOBAL/SESSION
用于开启或关闭逻辑预读功能。取值:
  • ON:开启。
  • OFF:关闭。
loose_logical_prefetch_rows_threshold
MySQL 5.7,MySQL 8.0,MySQL 8.4
OFF
[ON|OFF]
GLOBAL/SESSION
执行逻辑预读的扫描行数下限。若执行计划预估的扫描行数超过了该参数的设置值,才会执行逻辑预读。
loose_enable_blob_prefetch
MySQL 8.0,MySQL 8.4
OFF
[ON|OFF]
GLOBAL/SESSION
用于开启或关闭 blob 预读功能。取值:
  • ON:开启。
  • OFF:关闭。
loose_enable_track_index_io
MySQL 5.7,MySQL 8.0,MySQL 8.4
OFF
[ON|OFF]
GLOBAL/SESSION
用于开启或关闭 information_schema.rds_io_trace_stats 的 IO 指标观测功能。
使用示例
在实际应用前,您可以通过数据库工作台手动连接到备库执行预读 SQL 以测试优化效果,避免大范围扫描对主库造成较大压力。
SET SESSION loose_enable_logical_prefetch_page=ON; # 当前连接开启逻辑预读功能
SET SESSION loose_logical_prefetch_rows_threshold=100000; # 设置预估扫描行数阈值为 100,000
SET SESSION loose_enable_track_index_io=ON; # 用于观察预取 IO 统计信息,存在一定开销,请避免在生产环境全局开启
select sum(k) from test.sbtest1 where (k > 1 and k < 200000); # 测试 SQL
通过 SET SESSION loose_enable_track_index_io=ON 开启 IO 指标观测后,您可以通过执行 SELECT * FROM information_schema.rds_io_trace_stats WHERE thread_id = connection_Id() 观察当前线程是否执行了逻辑预读,执行逻辑预读的详细信息,以及可能的不支持原因:
需要观察的指标
指标说明
prepare_logical_prefetch.is_exceed_max_parallel
并发数是否超过当前支持的最大值。
prepare_logical_prefetch.btr_root_level
索引树高是否支持预读,树高仅有 1 层则不支持(数据量较少)。
finish_logical_prefetch.n_ctx_async_read_page_request
逻辑预读尝试发布的异步读取请求数量。
finish_logical_prefetch.n_ctx_async_read_page_success
逻辑预读成功发布的异步读取请求数量。
finish_logical_prefetch.ctx_execute
逻辑预读流程整体的耗时,可以代表 query 的整体延时。
注意事项
  • 开启逻辑预读功能后,由于预读线程的存在,IO/CPU 资源的占用量随之增加,可能会影响同一时间内正在执行的其他 SQL 操作,因此建议仅对需要的 SQL 选择性启用逻辑预读功能。
  • 逻辑预读暂不支持压缩表/分区表/非 INNODB 表。
  • 逻辑预读暂不支持多值索引/虚拟生成列索引/空间索引/全文索引/向量索引。
  • 由于 MySQL 5.7 版本 BLOB 数据仅能链式顺序读取,暂不支持 BLOB 对象的预读能力。
性能数据
  • 测试环境
节点规格为 2C4G 的 云数据库 MySQL 版 8.0 版本的云盘实例,存储空间为 10 TB。
  • 测试表数据
通过 sysbench prepare 插入 5 倍于测试范围行数的数据。
  • 测试方法及结果
每次测试前需要重启 MySQL 进程,保证内存 buffer_pool 中没有缓存数据,以测试实际执行效率的提升比例。
扫描范围(单位:行)
预取(单位:秒)
非预取(单位:秒)
耗时对比
100,000
0.44
0.62
-29.04%
500,000
2.20
3.03
-27.40%
2,000,000
9.05
13.48
-32.87%
5,000,000
21.48
30.16
-28.78%
10,000,000
43.14
62.17
-30.61%
50,000,000
209.44
302.33
-30.73%
100,000,000
424.69
737.57
-42.42%
最近更新时间:2026.05.28 11:52:21
这个页面对您有帮助吗?
有用
有用
无用
无用