目次
とある日
この記事はMySQL Advent Calendar 2023の18日目の記事です。
パフォーマンススキーマが素晴らしいので布教するための記事です。
パフォーマンススキーマとは
パフォーマンススキーマとは、MySQLサーバーの状態をモニタリングすることができます。
MySQL パフォーマンススキーマは低レベルで MySQL サーバーの実行をモニタリングするための機能です。
パフォーマンススキーマは、サーバーパフォーマンスに与える影響を最小にしながら、サーバー実行に関する有益な情報へのアクセスを提供することを目的としています。 実装はこれらの設計目標に従います。
特徴
- パフォーマンススキーマは、実行時にサーバーの内部実行を検査する方法を提供します。 それは、
PERFORMANCE_SCHEMA
ストレージエンジンおよびperformance_schema
データベースを使用して実装されます。 パフォーマンススキーマは、主にパフォーマンスデータに焦点を合わせています。 これは、メタデータの検査に使用されるINFORMATION_SCHEMA
と異なります。performance_schema
データベースでパフォーマンスデータを見れます
- パフォーマンススキーマはサーバーイベントをモニターします。 「イベント」は、時間がかかり、タイミング情報を収集できるようにインストゥルメントされた、サーバーが実行するすべてのことです。 一般に、イベントは、関数呼び出し、オペレーティングシステムの待機、解析やソートなどの SQL ステートメント実行のステージ、またはステートメント全体やステートメントのグループなどになります。 イベント収集を使用すると、サーバーやいくつかのストレージエンジンの同期呼び出し (相互排他ロックなど) ファイルやテーブルの I/O,テーブルロックに関する情報にアクセスできます。
- イベント情報から様々な情報を拾うことができます
- サーバーのモニタリングはごくわずかなオーバーヘッドで、継続的かつ目立たずに行われます。 パフォーマンススキーマのアクティブ化によって、サーバーが使用不能になりません。
- モニタリングツール特有の最小のオーバーヘッドで利用できます
- パフォーマンススキーマ内のテーブルは、永続的なディスク上のストレージを使用しないインメモリーテーブルです。 コンテンツは、サーバーの起動時から再移入され、サーバーの停止時に破棄されます。
- 永続的にデータを閲覧するためにはそれようの仕組みが必要です
ユースケース
後述しますが、よく使うユースケースとしてはSQLのパフォーマンスモニタリングです。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.12.4 パフォーマンススキーマ待機イベントテーブル
どのSQLがどこでボトルネックになっているのかを分析しています。
使い方
パフォーマンススキーマはデフォルトで有効になっています。 それを明示的に有効または無効にするには、
performance_schema
変数を適切な値に設定して、サーバーを起動します。 たとえば、サーバーmy.cnf
ファイルで次の行を使用します:
[mysqld] performance_schema=ON
MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.1 パフォーマンススキーマクイックスタート
最初に、すべてのインストゥルメントとコンシューマが有効にされていないため、パフォーマンススキーマはすべてのイベントを収集しません。 これらのすべてをオンにし、イベントタイミングを有効にするには、2 つのステートメントを実行します (行のカウントは MySQL バージョンによって異なることがあります)。
(root@localhost) [performance_schema] 8.0.33 > UPDATE performance_schema.setup_instruments -> SET ENABLED = 'YES', TIMED = 'YES'; Query OK, 960 rows affected (0.00 sec) Rows matched: 1245 Changed: 960 Warnings: 0
適当にSQLを実行します。
select s.emp_no, s.salary from test.salaries s where s.from_date <= '2000-01-01' and '2000-01-01' < s.to_date and s.emp_no in (select emp_no from test.employees where hire_date >= '1989-01-08') order by s.salary desc, s.emp_no limit 10\G; select s.emp_no, s.salary from test.salaries s ;
performance_schema
データベースからイベントを確認します。
(root@localhost) [performance_schema] 8.0.33 > select EVENT_NAME, SOURCE, TIMER_WAIT from performance_schema.events_stages_history\G; *************************** 1. row *************************** EVENT_NAME: stage/sql/Opening tables SOURCE: sql_base.cc:5795 TIMER_WAIT: 25600000 *************************** 2. row *************************** EVENT_NAME: stage/sql/init SOURCE: sql_select.cc:556 TIMER_WAIT: 1900000 *************************** 3. row *************************** EVENT_NAME: stage/sql/System lock SOURCE: lock.cc:331 TIMER_WAIT: 4000000 *************************** 4. row *************************** EVENT_NAME: stage/sql/optimizing SOURCE: sql_optimizer.cc:353 TIMER_WAIT: 1400000 *************************** 5. row *************************** EVENT_NAME: stage/sql/statistics SOURCE: sql_optimizer.cc:693 TIMER_WAIT: 7600000 *************************** 6. row *************************** EVENT_NAME: stage/sql/preparing SOURCE: sql_optimizer.cc:777 TIMER_WAIT: 9900000 *************************** 7. row *************************** EVENT_NAME: stage/sql/freeing items SOURCE: sql_parse.cc:5405 TIMER_WAIT: 25900000 *************************** 8. row *************************** EVENT_NAME: stage/sql/cleaning up SOURCE: sql_parse.cc:2484 TIMER_WAIT: 600000 *************************** 9. row *************************** EVENT_NAME: stage/sql/starting SOURCE: init_net_server_extension.cc:110 TIMER_WAIT: 89800000 *************************** 10. row *************************** EVENT_NAME: stage/sql/checking permissions SOURCE: sql_authorization.cc:2145 TIMER_WAIT: 5400000 10 rows in set (0.01 sec)
それぞれのイベントごとにどれぐらい時間がかかったかどうかがわかるので、ボトルネックの特定が簡単になります。
パフォーマンスインサイト(AWS)
AWSでは、このパフォーマンススキーマを使って、データベースパフォーマンスを視覚的に分析できるダッシュボードを提供しています。
仕事でよく使うのですが、とても便利だなと思ってます。
無料で一週間の記録を確認できます。 さらに、コストを支払うと過去の記録を保持してくれるため経時的な分析に活用することができます。
Performance Insights の無料利用枠
- 7 日間分のパフォーマンスデータ履歴
- 1 か月あたり 100 万件のリクエスト
また最近、機械学習を使って負荷を分析してくれる機能もリリースされました。
一定期間のデータベースパフォーマンスの分析 - Amazon Relational Database Service
これを使うことで、データベースにあまり詳しくなくても簡単にデータベースのパフォーマンス分析が可能になります。
Amazon RDS Performance Insights オンデマンド分析の活用 | NHN テコラス Tech Blog | AWS、機械学習、IoTなどの技術ブログ
〆
そのままのパフォーマンススキーマだと少し使うのに手間ですが、それをより使いやすい形にしたクラウドサービスが展開されており、それがものすごく使いやすいの紹介しました。
参考資料
AWS パフォーマンスインサイト
Amazon RDS での Performance Insights を使用したDB 負荷のモニタリング - Amazon Relational Database Service
初めてのPerformance Insights入門 | Amazon Web Services ブログ
Performance Insights(RDSのパフォーマンスを分析、チューニング)| AWS
MySQL パフォーマンススキーマ
MySQL :: MySQL 8.0 リファレンスマニュアル :: 27 MySQL パフォーマンススキーマ
MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.19 問題を診断するためのパフォーマンススキーマの使用
第4回 MySQLチューニング(3) パフォーマンススキーマ | gihyo.jp
パフォーマンススキーマに移行された情報について – スマートスタイル技術ブログ
日々の覚書: MySQLのperformance_schemaでどれくらいの情報が見られるのか
MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.1 パフォーマンススキーマクイックスタート
performance_schemaをsysで使い倒す! | Think IT(シンクイット)
トランザクションの MySQL パフォーマンス スキーマのマイニング