Performance Schema 提供預存陳述式的檢測,其中有兩種協定
二進位協定。這可透過 MySQL C API 存取,並如下表所示對應至底層伺服器命令。
C API 函數 對應的伺服器命令 mysql_stmt_prepare()COM_STMT_PREPAREmysql_stmt_execute()COM_STMT_EXECUTEmysql_stmt_close()COM_STMT_CLOSE文字協定。這可使用 SQL 陳述式存取,並如下表所示對應至底層伺服器命令。
SQL 陳述式 對應的伺服器命令 PREPARESQLCOM_PREPAREEXECUTESQLCOM_EXECUTEDEALLOCATE PREPARE、DROP PREPARESQLCOM_DEALLOCATE PREPARE
Performance Schema 預存陳述式檢測涵蓋兩種協定。以下討論指的是伺服器命令,而不是 C API 函數或 SQL 陳述式。
關於預存陳述式的資訊可在 prepared_statements_instances 表格中取得。此表格可檢查伺服器中使用的預存陳述式,並提供關於它們的彙總統計資訊。若要控制此表格的大小,請在伺服器啟動時設定 performance_schema_max_prepared_statements_instances 系統變數。
預存陳述式資訊的收集取決於下表所示的陳述式工具。預設會啟用這些工具。若要修改它們,請更新 setup_instruments 表格。
| 工具 | 伺服器命令 |
|---|---|
statement/com/Prepare |
COM_STMT_PREPARE |
statement/com/Execute |
COM_STMT_EXECUTE |
statement/sql/prepare_sql |
SQLCOM_PREPARE |
statement/sql/execute_sql |
SQLCOM_EXECUTE |
Performance Schema 管理 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 陳述式,預備陳述式的名稱為stmtPREPARE 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。用於 HeatWave Service 和 HeatWave,其中PRIMARY引擎為InnoDB,而SECONDARY引擎為 HeatWave (RAPID)。對於 MySQL Community Edition Server、MySQL Enterprise Edition Server(內部部署)和沒有 HeatWave 的 HeatWave Service,值始終為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,「陳述式摘要表格」)。xxxMAX_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 表格的統計資訊欄位。