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对应的服务器命令
PREPARESQLCOM_PREPARE
EXECUTESQLCOM_EXECUTE
DEALLOCATE PREPARE, DROP PREPARESQLCOM_DEALLOCATE PREPARE

性能模式准备的语句工具涵盖了这两个协议。以下讨论是针对服务器命令而不是 C API 函数或 SQL 语句。

有关准备好的语句的信息可在prepared_statements_instancestable 中找到。该 table 允许检查服务器中使用的准备好的语句,并提供有关这些语句的汇总统计信息。要控制此 table 的大小,请在服务器启动时设置performance_schema_max_prepared_statements_instances系统变量。

准备的语句信息的收集取决于下 table 中显示的语句工具。这些工具默认情况下处于启用状态。要修改它们,请更新setup_instrumentstable。

InstrumentServer Command
statement/com/PrepareCOM_STMT_PREPARE
statement/com/ExecuteCOM_STMT_EXECUTE
statement/sql/prepare_sqlSQLCOM_PREPARE
statement/sql/execute_sqlSQLCOM_EXECUTE

性能架构按以下方式 Managementprepared_statements_instancestable 的内容:

  • Statement preparation

COM_STMT_PREPARESQLCOM_PREPARE命令在服务器中创建一个准备好的语句。如果该语句已成功插入,则将新行添加到prepared_statements_instancestable。如果无法执行该语句,则Performance_schema_prepared_statements_lost status 变量增加。

  • 准备好的语句执行

对有条件的准备好的语句实例执行COM_STMT_EXECUTESQLCOM_PREPARE命令会更新相应的prepared_statements_instancestable 行。

  • 准备的语句释放

对已检测的准备好的语句实例执行COM_STMT_CLOSESQLCOM_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 的统计信息列。