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 社群版伺服器、MySQL 企業版伺服器(內部部署)和沒有 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 資料表的統計資料欄位。