25.12.6.4 prepare_statements_instancestable
性能架构为准备好的语句提供了工具,为此有两种协议:
- 二进制协议。可以通过 MySQL C API 访问它,并 Map 到基础服务器命令,如下 table 所示。
C API 函数 | 对应的服务器命令 |
---|---|
mysql_stmt_prepare() | COM_STMT_PREPARE |
mysql_stmt_execute() | COM_STMT_EXECUTE |
mysql_stmt_close() | COM_STMT_CLOSE |
- 文本协议。可以使用 SQL 语句访问此文件,并将其 Map 到基础服务器命令上,如下 table 所示。
SQL Statement | 对应的服务器命令 |
---|---|
PREPARE | SQLCOM_PREPARE |
EXECUTE | SQLCOM_EXECUTE |
DEALLOCATE PREPARE, DROP PREPARE | SQLCOM_DEALLOCATE PREPARE |
性能模式准备的语句工具涵盖了这两个协议。以下讨论是针对服务器命令而不是 C API 函数或 SQL 语句。
有关准备好的语句的信息可在prepared_statements_instancestable 中找到。该 table 允许检查服务器中使用的准备好的语句,并提供有关这些语句的汇总统计信息。要控制此 table 的大小,请在服务器启动时设置performance_schema_max_prepared_statements_instances系统变量。
准备的语句信息的收集取决于下 table 中显示的语句工具。这些工具默认情况下处于启用状态。要修改它们,请更新setup_instrumentstable。
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 |
性能架构按以下方式 Managementprepared_statements_instancestable 的内容:
- Statement preparation
COM_STMT_PREPARE
或SQLCOM_PREPARE
命令在服务器中创建一个准备好的语句。如果该语句已成功插入,则将新行添加到prepared_statements_instancestable。如果无法执行该语句,则Performance_schema_prepared_statements_lost status 变量增加。
- 准备好的语句执行
对有条件的准备好的语句实例执行COM_STMT_EXECUTE
或SQLCOM_PREPARE
命令会更新相应的prepared_statements_instancestable 行。
- 准备的语句释放
对已检测的准备好的语句实例执行COM_STMT_CLOSE
或SQLCOM_DEALLOCATE_PREPARE
命令会删除相应的prepared_statements_instancestable 行。为了避免资源泄漏,即使禁用了前面描述的准备好的语句工具,也会进行删除。
prepared_statements_instancestable 具有以下列:
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
对于由 Client 机会话创建的准备好的语句,这些列为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;
TIMER_PREPARE
执行语句准备本身所花费的时间。
COUNT_REPREPARE
内部重新准备该语句的次数(请参阅第 8.10.4 节“准备好的语句和存储程序的缓存”)。用于重新准备的时序统计信息不可用,因为它被计为语句执行的一部分,而不是单独的操作。
COUNT_EXECUTE
,SUM_TIMER_EXECUTE
,MIN_TIMER_EXECUTE
,AVG_TIMER_EXECUTE
,MAX_TIMER_EXECUTE
用于执行准备好的语句的汇总统计信息。
SUM_xxx
其余的SUM_xxx
列与语句摘要 table 相同(请参见第 25.12.15.3 节,“语句摘要 table”)。
TRUNCATE TABLE重置prepared_statements_instancestable 的统计信息列。