Plan Cache背景知识
一条SQL语句输入到MySQL服务器后,一般要经历:词法语法解析(parse),优化(optimize),生成执行计划(plan)和执行(execute)的过程。词法语法分析,优化以及生成执行计划,这三个阶段的主要输出是SQL语句的执行计划(plan),当SQL语句存在多种执行计划的时候,优化器会从这许多的执行计划中挑选出一个它认为最优的(通常是占用系统资源最少的,包括CPU以及IO等)作为最终的执行计划供执行器执行。生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。如果在一条SQL语句执行的过程中将该语句对应的最终执行计划进行缓存,当相似的语句再次被输入服务器时,就可以直接使用已缓存的执行计划,从而跳过SQL语句生成执行计划的整个过程,进而可以提高语句的执行速度。
ApsaraDB MySQL 执行计划缓存目前只支持SELECT操作的语句(以后会支持其他DML操作)。在相似的SQL语句大量重复出现(这里“相似”的SQL语句指的是SQL语句中除了常量有所不同外,其他都必须相同)时,使用执行计划缓存可以极大的节省语句的执行时间。同时,使用执行计划缓存会带来额外的内存开销,因此建议在内存充裕的情况下使用该功能。
Plan Cache的架构
说明:
图1表示的是ApsaraDB MySQL一条SQL语句输入MySQL服务器的执行过程。
图2表示的是当前ApsaraDB MySQL Plan Cache的架构图。
Plan Cache中的数据结构
如图2所示,Plan Cache包含了如下几种数据结构:
1. Execute_plan_cache_manager: 对整个Plan Cache进行管理,负责提供接口供Server其他模块调用。
2. Execute_plan_cache_partition(图示中的PartitionX): 为了减少“锁“对整个Plan Cache的增删改操作引发性能方面的影响,我们将Plan Cache 划分为多个partition,对于每条符合Plan Cache条件的SQL语句只对其对应的partition进行上“锁”。
3. Execute_plan_cache(图示中的PlanX):实际用来存储plan恢复所需的所有信息。
Plan Cache相关的系统变量
rds_enable_exec_plan_cache
范围
GLOBAL
类型
BOOL
功能
a) ON 打开Plan Cache功能。b) OFF 关闭Plan Cache功能,清空Plan Cache(默认)。
rds_max_digest_length
范围
GLOBAL
类型
LONG
功能
a) 设置SQL语句中常量替换后的的长度,