性能模式为预处理语句提供检测,预处理语句有两种协议:
二进制协议。此协议通过 MySQL C API 访问,并映射到底层服务器命令,如下表所示。
C API 函数 对应的服务器命令 mysql_stmt_prepare()COM_STMT_PREPAREmysql_stmt_execute()COM_STMT_EXECUTEmysql_stmt_close()COM_STMT_CLOSE文本协议。此协议使用 SQL 语句访问,并映射到底层服务器命令,如下表所示。
SQL 语句 对应的服务器命令 PREPARESQLCOM_PREPAREEXECUTESQLCOM_EXECUTEDEALLOCATE PREPARE、DROP PREPARESQLCOM_DEALLOCATE PREPARE
性能模式预处理语句检测涵盖了这两种协议。以下讨论指的是服务器命令,而不是 C API 函数或 SQL 语句。
有关预处理语句的信息可在 prepared_statements_instances 表中找到。此表允许检查服务器中使用的预处理语句,并提供有关它们的聚合统计信息。要控制此表的大小,请在服务器启动时设置 performance_schema_max_prepared_statements_instances 系统变量。
预处理语句信息的收集取决于下表所示的语句 Instrument。默认情况下启用这些 Instrument。要修改它们,请更新 setup_instruments 表。
| Instrument | 服务器命令 |
|---|---|
statement/com/Prepare |
COM_STMT_PREPARE |
statement/com/Execute |
COM_STMT_EXECUTE |
statement/sql/prepare_sql |
SQLCOM_PREPARE |
statement/sql/execute_sql |
SQLCOM_EXECUTE |
性能模式按如下方式管理 prepared_statements_instances 表的内容:
语句准备
COM_STMT_PREPARE或SQLCOM_PREPARE命令在服务器中创建预处理语句。如果成功检测到该语句,则会将新行添加到prepared_statements_instances表中。如果无法检测到该语句,则Performance_schema_prepared_statements_lost状态变量会递增。预处理语句执行
对已检测的预处理语句实例执行
COM_STMT_EXECUTE或SQLCOM_PREPARE命令会更新相应的prepared_statements_instances表行。预处理语句释放
对已检测的预处理语句实例执行
COM_STMT_CLOSE或SQLCOM_DEALLOCATE_PREPARE命令会删除相应的prepared_statements_instances表行。为了避免资源泄漏,即使禁用了前面描述的预处理语句 Instrument,也会执行删除操作。
prepared_statements_instances 表包含以下列:
OBJECT_INSTANCE_BEGIN已检测的预处理语句在内存中的地址。
STATEMENT_ID服务器分配的内部语句 ID。文本和二进制协议都使用语句 ID。
STATEMENT_NAME对于二进制协议,此列为
NULL。对于文本协议,此列是用户分配的外部语句名称。例如,对于以下 SQL 语句,预处理语句的名称为stmt:PREPARE stmt FROM 'SELECT 1';SQL_TEXT已准备语句文本,带有
?占位符标记。OWNER_THREAD_ID,OWNER_EVENT_ID这些列指示创建已准备语句的事件。
OWNER_OBJECT_TYPE,OWNER_OBJECT_SCHEMA,OWNER_OBJECT_NAME对于由客户端会话创建的已准备语句,这些列为
NULL。对于由存储程序创建的已准备语句,这些列指向该存储程序。一个典型的用户错误是忘记释放已准备语句。可以使用这些列来查找泄漏已准备语句的存储程序。SELECT OWNER_OBJECT_TYPE, OWNER_OBJECT_SCHEMA, OWNER_OBJECT_NAME, STATEMENT_NAME, SQL_TEXT FROM performance_schema.prepared_statements_instances WHERE OWNER_OBJECT_TYPE IS NOT NULL;查询执行引擎。值为
PRIMARY或SECONDARY。用于 HeatWave 服务和 HeatWave,其中PRIMARY引擎为InnoDB,SECONDARY引擎为 HeatWave (RAPID)。对于 MySQL 社区版服务器、MySQL 企业版服务器(本地部署)以及没有 HeatWave 的 HeatWave 服务,该值始终为PRIMARY。TIMER_PREPARE执行语句准备本身所花费的时间。
COUNT_REPREPARE语句在内部重新准备的次数(请参阅“10.10.3 节 “准备语句和存储程序的缓存””)。重新准备的时间统计信息不可用,因为它被计为语句执行的一部分,而不是单独的操作。
COUNT_EXECUTE,SUM_TIMER_EXECUTE,MIN_TIMER_EXECUTE,AVG_TIMER_EXECUTE,MAX_TIMER_EXECUTE已准备语句执行的汇总统计信息。
SUM_xxx其余的
SUM_列与语句摘要表中的相同(请参阅“29.12.20.3 节 “语句摘要表””)。xxxMAX_CONTROLLED_MEMORY报告已准备语句在执行期间使用的最大受控内存量。
MAX_TOTAL_MEMORY报告已准备语句在执行期间使用的最大内存量。
prepared_statements_instances 表具有以下索引:
主键:(
OBJECT_INSTANCE_BEGIN)索引:(
STATEMENT_ID)索引:(
STATEMENT_NAME)索引:(
OWNER_THREAD_ID,OWNER_EVENT_ID)索引:(
OWNER_OBJECT_TYPE,OWNER_OBJECT_SCHEMA,OWNER_OBJECT_NAME)
TRUNCATE TABLE 会重置 prepared_statements_instances 表的统计信息列。