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​
​
10240​
​
否​
​
[0-4294967295]​
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.10.23 18:46:16
这个页面对您有帮助吗?
有用
有用
无用
无用