前回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.
とすることで、
詳しく知りたい方は、