- 文档首页
云数据库 MySQL 版
内核功能
性能
Plan Cache
Plan Cache
本文介绍云数据库 MySQL 版提供 Plan Cache 功能的相关信息。
在高并发业务场景中,应用通常会反复执行结构相同、仅参数不同的 SQL 语句(例如:SELECT test FROM sbtest1 WHERE id = ?;),这类 SQL 在执行时通常需要经过解析、优化和生成执行计划等过程,当 SQL 执行频率高、查询逻辑较简单时,重复优化会带来额外 CPU 开销。
Plan Cache 用于缓存满足条件的预处理语句(prepared statement)的执行计划。开启该功能后,对于高频重复执行的简单参数化查询,数据库可在执行环境和表状态未发生影响计划选择的变化时复用已缓存的执行计划,从而减少重复优化开销,提升吞吐并降低延迟。
- MySQL 5.7 版本,且内核小版本为 MySQL 5.7.44_20260615 及以上。
- MySQL 8.0 版本,且内核小版本为 MySQL 8.0.43_20260415 及以上。
说明
您可通过查看实例信息查看实例的内核小版本。如您的实例为 MySQL 8.0.43_20260415 和 MySQL 5.7.44_20260615 之前的版本,可手动升级实例内核小版本。 Plan Cache 开启后,数据库会自动判断预处理语句是否满足缓存条件。对于满足条件的语句,数据库会在后续重复执行时尝试复用缓存计划;对于不满足条件的语句,数据库会按普通预处理语句流程执行。
- 高频重复执行的参数化单表 SELECT 预处理语句。
- 除上述场景外,MySQL 8.0 版本的实例,还适用于以下场景:
- 带 ORDER BY 和 LIMIT 的简单查询。
说明
Plan Cache 不生效不会影响 SQL 正常执行,只表示该 SQL 不会缓存或复用执行计划。
- loose_enable_plan_cache 参数取值为 OFF ,即未开启 Plan Cache 功能。
- 执行非 SELECT 语句,例如 INSERT、UPDATE、DELETE、INSERT ... SELECT。
- SQL 语句不是单表查询,或包含多表 JOIN、SEMI-JOIN。
- 非简单查询块场景,例如子查询、UNION、派生表、表函数,或包含外层查询块、内层查询表达式的查询。
- 使用不支持的复杂 SQL 语义,例如 GROUP BY、DISTINCT、ROLLUP、窗口函数、全文检索等复杂 SQL 语义。
- 查询中无 WHERE 查询条件,或 WHERE 条件不含 ? 参数。
- WHERE 子句为多字段组合条件,条件字段数量与索引查询时访问的索引列总数不匹配。
- 访问临时表、schema table、视图,以及 information_schema、performance_schema、mysql等系统库数据表。
- SQL 语句使用执行计划固化、优化器固化策略,或采用各类索引 Hint 语法。例如: FORCE INDEX、USE INDEX、IGNORE INDEX 等。
- MySQL 5.7 版本的实例除上述场景外,在执行非基于索引 (INDEX) 的等值查询时,Plan Cache 也会失效。
- MySQL 8.0 版本的实例除上述场景外,在以下场景 Plan Cache 也会失效:
- 执行启用 Hypergraph Optimizer 的查询。
说明
已缓存的执行计划失效后,后续执行会重新进入优化流程;如果语句仍满足缓存条件,数据库会重新构建缓存计划。
- loose_enable_plan_cache 参数取值为 OFF ,即关闭 Plan Cache 功能。
- 释放预处理语句,例如执行 DEALLOCATE PREPARE语句。
- 重新创建名称相同,或是 SQL 内容完全一致的预处理语句。
- 修改优化器配置参数 (optimizer_switch)。
- 数据表统计信息出现大幅变动,典型场景为表统计行数发生显著变化。
参数说明:
您可以通过以下命令开启或关闭 Plan Cache 功能。若您的实例不支持通过 SET 命令操作,也可以通过控制台修改参数。
- 查看开启 Plan Cache 功能后,已缓存的执行计划数量。
您需使用 MySQL 预处理语法执行参数化的 SQL 语句。基本语法如下:
示例二:索引范围查询(仅 MySQL 8.0 实例适用)
以下性能数据来自预处理语句执行模式执行 SQL 方式下的 Sysbench 典型只读场景测试。测试覆盖 CPU 资源满载和 CPU 未饱和两类负载状态,对比开启 Plan Cache 前后的 TPS/QPS 和平均延迟变化。
- 测试方式:通过预处理语句执行模式执行 Sysbench 典型只读场景。
- 测试场景:oltp_point_select、oltp_read_only。
- 数据规模:10 张表,每张表 500000 行数据。
- 对比指标:TPS/QPS 提升比例、平均延迟下降比例。
- 关闭 Plan Cache,执行基准测试并记录 TPS/QPS、平均延迟。
- 开启 Plan Cache,执行相同测试并记录 TPS/QPS、平均延迟。
以下性能数据来自预处理语句执行模式执行 SQL 方式下的 Sysbench 典型读写场景测试。测试覆盖 CPU 资源满载和 CPU 未饱和两类负载状态,对比开启 Plan Cache 前后的 TPS/QPS 和平均延迟变化。
- 测试方式:通过预处理语句执行模式执行 Sysbench 典型读写场景。
- 测试场景:oltp_point_select、select_random_points、oltp_read_only、oltp_read_write。
- 数据规模:10 张表,每张表 500000 行数据。
- 对比指标:TPS/QPS 提升比例、平均延迟下降比例。
- 关闭 Plan Cache,执行基准测试并记录 TPS/QPS、平均延迟。
- 开启 Plan Cache,执行相同测试并记录 TPS/QPS、平均延迟。
最近更新时间:2026.09.09 17:05:25