性能模式提供了预备语句的仪表盘,共有两个协议:
-
二进制协议。这通过 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 服务器、MySQL Enterprise Edition 服务器(on-premise)和不带 HeatWave 的 MySQL HeatWave 服务,该值始终为PRIMARY
。 -
TIMER_PREPARE
语句准备本身的执行时间。
-
COUNT_REPREPARE
语句内部重新准备的次数(参见 第 10.10.3 节,“Caching of Prepared Statements and Stored Programs”)。重新准备的时间统计信息不可用,因为它被计入语句执行,而不是单独的操作。
-
COUNT_EXECUTE
,SUM_TIMER_EXECUTE
,MIN_TIMER_EXECUTE
,AVG_TIMER_EXECUTE
,MAX_TIMER_EXECUTE
准备语句的执行聚合统计信息。
-
SUM_
xxx
剩余的
SUM_
列与语句摘要表相同(参见 第 29.12.20.3 节,“Statement Summary Tables”)。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
表的统计列。