29.12.6.4 prepared_statements_instances 表
性能模式提供了用于预编译语句的监控功能,其中有两个协议:
-
二进制协议。这通过MySQL C API访问,并映射到以下表格中显示的底层服务器命令。
C API Function Corresponding Server Command mysql_stmt_prepare()COM_STMT_PREPAREmysql_stmt_execute()COM_STMT_EXECUTEmysql_stmt_close()COM_STMT_CLOSE -
文本协议。这通过SQL语句访问,并映射到以下表格中显示的底层服务器命令。
SQL Statement Corresponding Server Command PREPARESQLCOM_PREPAREEXECUTESQLCOM_EXECUTEDEALLOCATE PREPARE,DROP PREPARESQLCOM_DEALLOCATE PREPARE
性能模式的预编译语句监控涵盖了两个协议。以下讨论将指代服务器命令,而不是C API函数或SQL语句。
关于预编译语句的信息可在prepared_statements_instances表中找到。这张表使得可以检查服务器中使用的预编译语句,并提供了关于它们的聚合统计信息。要控制这张表的大小,在启动服务器时设置performance_schema_max_prepared_statements_instances系统变量。
收集预编译语句信息取决于以下表格中显示的语句仪器。这些仪器默认启用。要修改它们,更新setup_instruments表。
| Instrument | Server Command |
|---|---|
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表格行。为了避免资源泄露,移除操作即使预准备语句的监控被禁用也会发生。
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。对于MySQL HeatWave服务和HeatWave,PRIMARY引擎是InnoDB,而SECONDARY引擎是HeatWave(RAPID)。对于MySQL Community Edition Server、MySQL Enterprise Edition Server(本地部署)和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节,“语句摘要表”)相同。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 表格的统计列。