パフォーマンススキーマのコンセプトと構造
パフォーマンススキーマは、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)