Performance Schema 为预处理语句提供检测,预处理语句有两种协议
二进制协议。它通过 MySQL C API 访问,并映射到基础服务器命令,如以下表格所示。
C API 函数 对应的服务器命令 mysql_stmt_prepare()
COM_STMT_PREPARE
mysql_stmt_execute()
COM_STMT_EXECUTE
mysql_stmt_close()
COM_STMT_CLOSE
文本协议。它使用 SQL 语句访问,并映射到基础服务器命令,如以下表格所示。
SQL 语句 对应的服务器命令 PREPARE
SQLCOM_PREPARE
EXECUTE
SQLCOM_EXECUTE
DEALLOCATE PREPARE
,DROP PREPARE
SQLCOM_DEALLOCATE PREPARE
Performance Schema 预处理语句检测涵盖两种协议。以下讨论指的是服务器命令,而不是 C API 函数或 SQL 语句。
有关预处理语句的信息可在 prepared_statements_instances
表中找到。该表可用于检查服务器中使用的预处理语句,并提供有关它们的汇总统计信息。要控制该表的大小,请在服务器启动时设置 performance_schema_max_prepared_statements_instances
系统变量。
预处理语句信息的收集取决于以下表格中所示的语句工具。这些工具默认启用。要修改它们,请更新 setup_instruments
表。
工具 | 服务器命令 |
---|---|
statement/com/Prepare |
COM_STMT_PREPARE |
statement/com/Execute |
COM_STMT_EXECUTE |
statement/sql/prepare_sql |
SQLCOM_PREPARE |
statement/sql/execute_sql |
SQLCOM_EXECUTE |
Performance Schema 按以下方式管理 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
表行。为了避免资源泄漏,即使先前描述的预处理语句工具被禁用,也会进行删除。
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 Community Edition Server、MySQL Enterprise Edition Server(本地)和没有 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 节,“语句汇总表”)。xxx
MAX_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
表的统计列。