前回statement_プロシージャを紹介します。使用しているMySQLのバージョンは5.
statement_performance_analyzer() プロシージャ
概要
このプロシージャは、SUPER権限が必要になります。これは、SET sql_を内部で実行するためです。
events_statements_summary_by_digestテーブル
performance_テーブルを基に分析します。プロシージャの説明の前に、
このテーブルはMySQLで実行されたSQLステートメントのさまざま統計情報を格納します。たとえば、
また、statement_ビューなどを提供しています。
mysql> SELECT * FROM performance_schema.events_statements_summary_by_digest \G
*************************** 1. row ***************************
SCHEMA_NAME: test
DIGEST: 496988680ff6fdbc042a2f62f2892a6a
DIGEST_TEXT: SELECT * FROM `t0` WHERE `id` = ?
COUNT_STAR: 1
SUM_TIMER_WAIT: 764207000
MIN_TIMER_WAIT: 764207000
AVG_TIMER_WAIT: 764207000
MAX_TIMER_WAIT: 764207000
SUM_LOCK_TIME: 424000000
SUM_ERRORS: 0
SUM_WARNINGS: 0
SUM_ROWS_AFFECTED: 0
SUM_ROWS_SENT: 1
SUM_ROWS_EXAMINED: 1
SUM_CREATED_TMP_DISK_TABLES: 0
SUM_CREATED_TMP_TABLES: 0
SUM_SELECT_FULL_JOIN: 0
SUM_SELECT_FULL_RANGE_JOIN: 0
SUM_SELECT_RANGE: 0
SUM_SELECT_RANGE_CHECK: 0
SUM_SELECT_SCAN: 0
SUM_SORT_MERGE_PASSES: 0
SUM_SORT_RANGE: 0
SUM_SORT_ROWS: 0
SUM_SORT_SCAN: 0
SUM_NO_INDEX_USED: 0
SUM_NO_GOOD_INDEX_USED: 0
FIRST_SEEN: 2018-11-13 16:48:26
LAST_SEEN: 2018-11-13 16:48:26
SQLステートメントはDIGEST_カラムに表示されているように正規化され、DIGESTカラムはDIGEST_カラムのSQLステートメントのハッシュ値が入ります。
mysql> SELECT /* comment */ * FROM t0 WHERE col1 = 1 AND col2 > 100 mysql> SELECT * FROM t0 where col1=99 AND col1 > 999
余分な空白やコメントは排除、?で丸めて、
mysql> SELECT * FROM t0 WHERE col1 = ? AND col2 > ?
結果として正規化後が同じ形式になるので、
そして、events_テーブルからスナップショットを取得して、
実行方法
まずは、
①ベースとなるスナップショットを保存するテンポラリテーブル(ベーステーブル)作成
sys.テンポラリテーブルが作成されます。
CALL sys.statement_performance_analyzer('create_tmp', 'sys.base', NULL);
②初期のスナップショット作成
events_のデータがsys.というテンポラリテーブルにコピーされます。tmp_テーブルはハードコードされたテンポラリテーブルです。
CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
③ベーステーブルに初期スナップショット保存
②で取得されたsys.のデータがsys.へコピーされます。
CALL sys.statement_performance_analyzer('save', 'sys.base', NULL);
④待機
ここで数秒待機します。
⑤スナップショット作成
events_のデータがsys.というテンポラリテーブルにコピーされます。
CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
⑥分析
⑤で取得したsys.と③で取得したsys.の差分を表示します。
CALL sys.statement_performance_analyzer('delta', 'sys.base', 'analysis')\G
*************************** 1. row ***************************
Next Output: Top 100 Queries Ordered by Total Latency
1 row in set (0.03 sec)
*************************** 1. row ***************************
query: SELECT * FROM `t0` LIMIT ?
db: test
full_scan:
exec_count: 14
err_count: 0
warn_count: 0
total_latency: 2.42 ms
max_latency: 284.70 us
avg_latency: 172.73 us
lock_latency: 1.11 ms
rows_sent: 14
rows_sent_avg: 1
rows_examined: 14
rows_examined_avg: 1
rows_affected: 0
rows_affected_avg: 0
tmp_tables: 0
tmp_disk_tables: 0
rows_sorted: 0
sort_merge_passes: 0
digest: 0fa9052a072b228c4bbc5363d21719b5
first_seen: 2018-11-13 19:53:31
last_seen: 2018-11-13 19:56:10
〈以下割愛〉
上記の場合は③と⑤の間での、SELECT * FROM t0 LIMIT ?のクエリの分析結果が表示されています。このような形で分析できるようになります。
パラメータの紹介
statement_ というように3つの引数をとります。
- in_
action - アクションを指定します。以下の中から選択できます。
-
- snapshot…in_
tableに指定されたテーブルからtmp_ digestsテーブルへスナップショットを保存します。in_ tableにNULLを指定すると events_テーブルからスナップショットを作成しますstatements_ summary_ by_ digest - save…tmp_
digestsテーブルからin_ tableで指定されたテーブルにスナップショットを作成します - overall…in_
tableで指定されたテーブルの内容に基づいて分析します。in_ tableにNULLを指定するとtmp_ digestsテーブルから分析します。 - delta…差分解析します。in_
tableに指定されたテーブルとtmp_ digestsテーブルの間で計算されます。 - create_
tmp…スナップショットを保存する一時テーブルを作成します。 - cleanup…スナップショットおよびデルタに使用される一時テーブルを削除します。
- snapshot…in_
- in_
table - in_
actionに一部で使用されるテーブル名を指定します。 - in_
views - どのビューをベースとするかを指定します。
-
- analysis…
statement_ビューanalysis - with_
runtimes_ in_ 95th_ percentile… statements_ビューwith_ runtimes_ in_ 95th_ percentile - with_
errors_ or_ warnings… statements_ビューwith_ errors_ or_ warnings - with_
full_ table_ scans… statements_ビューwith_ full_ table_ scans - with_
sorting… statements_ビューwith_ sorting - with_
temp_ tables… statements_ビューwith_ temp_ tables - custom …独自で作成したビュー
- analysis…
これらのcustom以外のビューはすべてsysスキーマ上に存在していて、events_テーブルです。詳しく説明しませんが、
先ほどの例で、
CALL sys.statement_performance_analyzer('delta', 'sys.base', 'with_sorting')
まとめ
このプロシージャでさまざまな分析が可能です。前述のin_customを利用することで独自の分析もできます。SET @sys.とすることで、
詳しく知りたい方は、