パフォーマンススキーマ ( 1 )

August 20, 2018

パフォーマンススキーマのコンセプトと構造

パフォーマンススキーマは、mysqld の各所に埋め込まれた計器と呼ばれるコードを通じて、データ採集を行う。プログラムの実行が観測点に差し掛かった時にバッファにデータを貯めておき、バッファ上のパフォーマンスデータはユーザーからのリクエストがあった時に出力される。リクエストは performance_schema データベース上にあるテーブルへのクエリという形で行われ、それらのテーウルはパフォーマンススキーマ専用のストレージエンジンとして実装されている。通常のテーブルと同様の方法でアクセスが可能であるため、SQL により加工が可能となる。
パフォーマンススキーマは計器ごとに on/off が可能であり、データ収集をする前に on にしておく必要がある。

情報スキーマとの違い

パフォーマンススキーマは、テーブルを通じてさまざな情報を取得するという点で、情報スキーマに近いが、用途や仕組みは異なる。
以下にパフォーマンススキーマと情報スキーマの違いを示す。

パフォーマンススキーマ 情報スキーマ
主目的 パフオォーマンスデータの取得 メタデータの取得
アプリケーション パフォーマンスチューニング 監視/管理ツール
導入されたバージョン 5.5 5.0
SQL 標準 No (MySQL 独自) Yes
実装方法 ストレージエンジンとして実装 情報スキーマ API
データ収集のタイミング mysqld 内部でコードを実行するたび 情報スキーマテーブルアクセス時
通常時のオーバーヘッド あり なし
表示によるオーバーヘッド 少ない 大きい
類似のツール DTrace/SystemTap 各種 SHOW コマンド

パフォーマンススキーマはあくまでもパフォーマンスデータを収集するためのものであり、豊富なデータをできるだけ小さなオーバーヘッドで収集できるように工夫されている。
一方、情報スキーマはある瞬間のデータベースの状態、つまりメタデータを取得するものであり、オーバーヘッドは比較的大きい。

情報スキーマから取得できるメタデータは以下のようなものとなる。

mysql> SELECT * FROM SCHEMATA;  
+--------------+--------------------+----------------------------+------------------------+----------+  
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |  
+--------------+--------------------+----------------------------+------------------------+----------+  
| def          | information_schema | utf8                       | utf8_general_ci        | NULL     |  
| def          | hoge               | latin1                     | latin1_swedish_ci      | NULL     |  
| def          | mysql              | latin1                     | latin1_swedish_ci      | NULL     |  
| def          | performance_schema | utf8                       | utf8_general_ci        | NULL     |  
| def          | sys                | utf8                       | utf8_general_ci        | NULL     |  
| def          | world              | latin1                     | latin1_swedish_ci      | NULL     |  
+--------------+--------------------+----------------------------+------------------------+----------+  
6 rows in set (0.00 sec)  
  
mysql> SELECT * FROM SCHEMA_PRIVILEGES;  
+-----------------------------+---------------+--------------------+----------------+--------------+  
| GRANTEE                     | TABLE_CATALOG | TABLE_SCHEMA       | PRIVILEGE_TYPE | IS_GRANTABLE |  
+-----------------------------+---------------+--------------------+----------------+--------------+  
| 'mysql.sys'@'localhost'     | def           | sys                | TRIGGER        | NO           |  
| 'mysql.session'@'localhost' | def           | performance_schema | SELECT         | NO           |  
+-----------------------------+---------------+--------------------+----------------+--------------+  
2 rows in set (0.01 sec)  
  
mysql> SELECT * FROM TABLE_PRIVILEGES;  
+-----------------------------+---------------+--------------+------------+----------------+--------------+  
| GRANTEE                     | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |  
+-----------------------------+---------------+--------------+------------+----------------+--------------+  
| 'mysql.session'@'localhost' | def           | mysql        | user       | SELECT         | NO           |  
| 'mysql.sys'@'localhost'     | def           | sys          | sys_config | SELECT         | NO           |  
+-----------------------------+---------------+--------------+------------+----------------+--------------+  
2 rows in set (0.00 sec)  

 © 2023, Dealing with Ambiguity