パフォーマンススキーマはプリペアドステートメントのインストゥルメンテーションを提供しますが、次の 2 つのプロトコルがあります:
-
バイナリプロトコル。 これには MySQL C API を介してアクセスし、次のテーブルに示すように基礎となるサーバーコマンドにマップします。
C API 関数 対応するサーバーコマンド mysql_stmt_prepare()
COM_STMT_PREPARE
mysql_stmt_execute()
COM_STMT_EXECUTE
mysql_stmt_close()
COM_STMT_CLOSE
-
テキストプロトコル。 これには SQL ステートメントを使用してアクセスし、次のテーブルに示すように基礎となるサーバーコマンドにマップします。
SQL ステートメント 対応するサーバーコマンド 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
テーブルを更新します。
金融商品 | サーバーコマンド |
---|---|
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;
-
TIMER_PREPARE
ステートメントの準備自体の実行に要した時間。
-
COUNT_REPREPARE
ステートメントが内部的に再準備された回数 (セクション8.10.3「プリペアドステートメントおよびストアドプログラムのキャッシュ」 を参照)。 再準備のタイミング統計は、個別の操作としてではなくステートメントの実行の一部としてカウントされるため、使用できません。
-
COUNT_EXECUTE
,SUM_TIMER_EXECUTE
,MIN_TIMER_EXECUTE
,AVG_TIMER_EXECUTE
,MAX_TIMER_EXECUTE
プリペアドステートメントの実行の集計統計。
-
SUM_
xxx
残りの
SUM_
カラムは、ステートメントサマリーテーブルと同じです (セクション27.12.18.3「ステートメントサマリーテーブル」 を参照)。xxx
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
テーブルの統計カラムがリセットされます。