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

云数据库 MySQL 版

复制全文
下载 pdf
性能
Plan Cache
复制全文
下载 pdf
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 在以下场景会失效:​
说明​
Plan Cache 不生效不会影响 SQL 正常执行,只表示该 SQL 不会缓存或复用执行计划。​
  • loose_enable_plan_cache 参数取值为 OFF ,即未开启 Plan Cache 功能。​
  • 执行未进行预处理的 SQL 语句。​
  • 执行非 SELECT 语句,例如 INSERT、UPDATE、DELETE、INSERT ... SELECT。​
  • SQL 语句不是单表查询,或包含多表 JOIN、SEMI-JOIN。​
  • SELECT 语句中的表为分区表。​
  • 非简单查询块场景,例如子查询、UNION、派生表、表函数,或包含外层查询块、内层查询表达式的查询。​
  • 使用不支持的复杂 SQL 语义,例如 GROUP BY、DISTINCT、ROLLUP、窗口函数、全文检索等复杂 SQL 语义。​
  • 涉及存储过程或自定义函数的查询场景。​
  • 查询中无 WHERE 查询条件,或 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 内容完全一致的预处理语句。​
  • 查询关联的数据表执行 DDL 结构变更操作。​
  • 修改优化器配置参数 (optimizer_switch)。​
  • 修改会话或数据表的字符集、排序规则。​
  • 修改数据库执行模式参数 (sql_mode)。​
  • 数据表统计信息出现大幅变动,典型场景为表统计行数发生显著变化。​
使用说明​
开启或关闭 Plan Cache 功能​
参数说明:​
​
参数名称​
类型​
默认值​
是否需要重启实例以生效​
取值范围​
级别​
参数描述​
loose_enable_plan_cache​
Boolean​
OFF​
否​
ON、OFF​
GLOBAL​
是否开启Plan Cache功能。​
  • 设置为 ON 后,数据库会缓存满足条件的预处理语句的执行计划。​
  • 设置为 OFF 后,数据库不再使用 Plan Cache 功能。​
​
您可以通过以下命令开启或关闭 Plan Cache 功能。若您的实例不支持通过 SET 命令操作,也可以通过控制台修改参数。​
  • 开启 Plan Cache 功能:​
  • ​
    SET GLOBAL loose_enable_plan_cache = ON;​
    ​
  • 关闭 Plan Cache 功能:​
  • ​
    SET GLOBAL loose_enable_plan_cache = OFF;​
    ​
  • 查看是否开启 Plan Cache 功能。​
  • ​
    SHOW VARIABLES LIKE 'loose_enable_plan_cache';​
    ​
  • 查看开启 Plan Cache 功能后,已缓存的执行计划数量。​
  • ​
    SHOW GLOBAL STATUS LIKE 'Cached_prepared_stmt_count';​
    ​
语法说明​
您需使用 MySQL 预处理语法执行参数化的 SQL 语句。基本语法如下:​
​
PREPARE stmt_name FROM 'SELECT ... WHERE col = ?';​
SET @param_name = value;​
EXECUTE stmt_name USING @param_name;​
DEALLOCATE PREPARE stmt_name;​
​
使用示例​
示例一:主键点查​
​
CREATE TABLE t_plan_cache_demo (​
id BIGINT PRIMARY KEY,​
c VARCHAR(64),​
KEY idx_c (c)​
);​
​
INSERT INTO t_plan_cache_demo VALUES​
(1, 'a'),​
(2, 'b'),​
(3, 'c');​
​
SET GLOBAL loose_enable_plan_cache = ON;​
​
PREPARE stmt_point_select FROM​
'SELECT c FROM t_plan_cache_demo WHERE id = ?';​
​
SET @id = 1;​
EXECUTE stmt_point_select USING @id;​
​
SET @id = 2;​
EXECUTE stmt_point_select USING @id;​
​
SET @id = 3;​
EXECUTE stmt_point_select USING @id;​
​
SHOW GLOBAL STATUS LIKE 'Cached_prepared_stmt_count';​
​
DEALLOCATE PREPARE stmt_point_select;​
​
示例二:索引范围查询(仅 MySQL 8.0 实例适用)​
​
SET GLOBAL loose_enable_plan_cache = ON;​
​
PREPARE stmt_range_select FROM​
'SELECT id, c FROM t_plan_cache_demo WHERE c >= ? ORDER BY c LIMIT 10';​
​
SET @c = 'a';​
EXECUTE stmt_range_select USING @c;​
​
SET @c = 'b';​
EXECUTE stmt_range_select USING @c;​
​
SET @c = 'c';​
EXECUTE stmt_range_select USING @c;​
​
SHOW GLOBAL STATUS LIKE 'Cached_prepared_stmt_count';​
​
DEALLOCATE PREPARE stmt_range_select;​
​
性能测试​
​
MySQL 5.7
MySQL 8.0
​
以下性能数据来自预处理语句执行模式执行 SQL 方式下的 Sysbench 典型只读场景测试。测试覆盖 CPU 资源满载和 CPU 未饱和两类负载状态,对比开启 Plan Cache 前后的 TPS/QPS 和平均延迟变化。​
测试环境​
  • 测试方式:通过预处理语句执行模式执行 Sysbench 典型只读场景。​
  • 测试场景:oltp_point_select、oltp_read_only。​
  • 数据规模:10 张表,每张表 500000 行数据。​
  • 对比指标:TPS/QPS 提升比例、平均延迟下降比例。​
测试步骤​
  1. 准备测试表和测试数据。​
  1. 关闭 Plan Cache,执行基准测试并记录 TPS/QPS、平均延迟。​
  • ​
    SET GLOBAL loose_enable_plan_cache = OFF;​
    ​
  1. 开启 Plan Cache,执行相同测试并记录 TPS/QPS、平均延迟。​
  • ​
    SET GLOBAL loose_enable_plan_cache = ON;​
    ​
  1. 对比开启前后的性能数据。​
  1. 通过状态变量确认缓存计划数量。​
  • ​
    SHOW GLOBAL STATUS LIKE 'Cached_prepared_stmt_count';​
    ​
测试结果​
​
测试场景​
TPS/QPS 提升​
平均延迟下降​
oltp_point_select​
21.4%​
17.4%​
oltp_read_only​
12.6%​
17.8%​
​
​
最近更新时间:2026.09.09 17:05:25
这个页面对您有帮助吗?
有用
有用
无用
无用