Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  MySQL パフォーマンススキーマ  /  パフォーマンススキーマステートメントダイジェスト

22.7 パフォーマンススキーマステートメントダイジェスト

MySQL 5.6.5 現在、パフォーマンススキーマはステートメントダイジェスト情報を保守します。ダイジェストは、SQL ステートメントを正規化形式に変換し、結果のハッシュ値を計算します。正規化により、類似のステートメントがグループ化され、要約されて、サーバーが実行しているステートメントの種類とそれらが発生する頻度に関する情報が公開されます。このセクションでは、どのようにステートメントの正規化が行われ、どのように役立つ可能性があるかについて説明します。

ステートメントのダイジェストには、これらのパフォーマンススキーマコンポーネントが関係します。

  • setup_consumers テーブル内の statement_digest コンシューマは、パフォーマンススキーマがダイジェスト情報を保守するかどうかを制御します。

  • ステートメントイベントテーブル (events_statements_currentevents_statements_history、および events_statements_history_long) には、ダイジェスト MD5 値と対応する正規化されたステートメントテキスト文字列を格納する DIGEST および DIGEST_TEXT カラムがあります。

  • events_statements_summary_by_digest テーブルは集計されたステートメントダイジェスト情報を提供します。

ステートメントの正規化によって、ステートメントテキストは、一般的なステートメント構造を保持しながら、構造に不可欠でない情報を削除する、より標準化された文字列表現に変換されます。データベースまたはテーブル名などのオブジェクト識別子は保持されます。値とコメントは削除され、空白は調整されます。パフォーマンススキーマは、名前、パスワード、日付などの情報を保持しません。

これらのステートメントを考慮してください。

SELECT * FROM orders WHERE customer_id=10 AND quantity>20
SELECT * FROM orders WHERE customer_id = 20 AND quantity > 100

これらのステートメントを正規化するため、パフォーマンススキーマはデータ値を ? に置換し、空白を調整します。どちらのステートメントも同じ正規化形式になるため、同じとみなされます。

SELECT * FROM orders WHERE customer_id = ? AND quantity > ?

正規化されたステートメントは、格納される情報は少ないですが、引き続き元のステートメントを代表しています。さまざまな比較値を持つほかの類似のステートメントは同じ正規化形式になります。

ここで、これらのステートメントを考慮してください。

SELECT * FROM customers WHERE customer_id = 1000
SELECT * FROM orders WHERE customer_id = 1000

この場合、ステートメントは同じではありません。オブジェクト識別子が異なるため、ステートメントは異なる正規化形式になります。

SELECT * FROM customers WHERE customer_id = ?
SELECT * FROM orders WHERE customer_id = ?

正規化されたステートメントは固定長です。DIGEST_TEXT 値の最大長は 1024 バイトです。この最大を変更するオプションはありません。正規化によって、この長さを超えるステートメントが生成された場合、テキストは ... で終わります。... のあとの部分のみが異なる長いステートメントは同じとみなされます。これらのステートメントを考慮してください。

SELECT * FROM mytable WHERE cola = 10 AND colb = 20
SELECT * FROM mytable WHERE cola = 10 AND colc = 20

AND の直後にカットオフが発生した場合、両方のステートメントがこの正規化形式になります。

SELECT * FROM mytable WHERE cola = ? AND ...

この場合、2 つ目のカラム名の違いが失われ、両方のステートメントが同じとみなされます。

正規化された各ステートメントについて、パフォーマンススキーマはハッシュダイジェスト値を計算し、その値とステートメントをステートメントイベントテーブル (events_statements_currentevents_statements_history、および events_statements_history_long) の DIGEST および DIGEST_TEXT カラムに格納します。さらに、同じ SCHEMA_NAME および DIGEST 値を持つステートメントの情報が events_statements_summary_by_digest サマリーテーブルに集計されます。パフォーマンススキーマは MD5 ハッシュ値を使用します。それらは計算が速く、競合を最小にする望ましい統計的分布を持つためです。

events_statements_summary_by_digest サマリーテーブルは固定サイズであるため、それがいっぱいになると、テーブル内の既存の値に一致しない SCHEMA_NAME および DIGEST 値のあるステートメントは、SCHEMA_NAME および DIGESTNULL に設定された特別な行にグループ化されます。これにより、すべてのステートメントがカウントされます。ただし、特別な行が、実行されるステートメントの大きな割合を占める場合、サマリーテーブルのサイズを増やすことが望ましい可能性があります。これを実行するには、サーバーの起動時に、performance_schema_digests_size システム変数を大きな値に設定します。performance_schema_digests_size 値が指定されていない場合、サーバーは起動時に使用する値を推定します。(MySQL 5.6.9 より前では、SCHEMA_NAME カラム値がなく、特別な行の DIGESTNULL に設定されます。)

ステートメントダイジェストサマリーテーブルは、サーバーによって実行されるステートメントのプロファイルを提供します。それは、アプリケーションが実行しているステートメントの種類とその頻度を示します。アプリケーション開発者はこの情報をテーブル内のほかの情報と組み合わせて使用し、アプリケーションのパフォーマンス特性を査定できます。たとえば、待機時間、ロック時間、またはインデックスの使用を示すテーブルカラムは不十分なクエリーの種類を強調表示することができます。これにより、開発者が注意が必要なアプリケーションの部分を把握できます。