29.12.6.4 prepared_statements_instances 表
性能模式提供了用于预编译语句的监控功能,其中有两个协议:
-
二进制协议。这通过MySQL C API访问,并映射到以下表格中显示的底层服务器命令。
C API Function Corresponding Server Command mysql_stmt_prepare()
COM_STMT_PREPARE
mysql_stmt_execute()
COM_STMT_EXECUTE
mysql_stmt_close()
COM_STMT_CLOSE
-
文本协议。这通过SQL语句访问,并映射到以下表格中显示的底层服务器命令。
SQL Statement Corresponding Server Command PREPARE
SQLCOM_PREPARE
EXECUTE
SQLCOM_EXECUTE
DEALLOCATE PREPARE
,DROP PREPARE
SQLCOM_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
表格的统计列。