データベースのパフォーマンス向上に役立つ Performance Schema events_transactions_history_long テーブルの使い方


events_transactions_history_long テーブルは、MariaDB 10.5.2 以降で導入された Performance Schema の一部であり、グローバルに完了したすべてのトランザクションイベントの履歴を保持します。これは、パフォーマンス分析、デバッグ、およびトランザクションに関する問題の特定に役立ちます。

テーブル構造

events_transactions_history_long テーブルは、以下の列で構成されています。



トランザクションのコミット数とロールバック数を取得

SELECT
  COUNT(*) AS total_transactions,
  SUM(TRX_COMMITTED) AS committed_transactions,
  SUM(TRX_ROLLED_BACK) AS rolled_back_transactions
FROM performance_schema.events_transactions_history_long;

特定の時間枠におけるトランザクションの長さ (秒) の平均と最大値を分析

SELECT
  AVG(TIME_WAIT + TIME_TRX) AS avg_transaction_duration,
  MAX(TIME_WAIT + TIME_TRX) AS max_transaction_duration
FROM performance_schema.events_transactions_history_long
WHERE START_TIME >= '2024-07-04 00:00:00'
  AND START_TIME < '2024-07-05 00:00:00';

特定のスキーマにおけるコミットされたトランザクションとロールバックされたトランザクションの数をカウント

SELECT
  SCHEMA_NAME,
  COUNT(*) AS total_transactions,
  SUM(TRX_COMMITTED) AS committed_transactions,
  SUM(TRX_ROLLED_BACK) AS rolled_back_transactions
FROM performance_schema.events_transactions_history_long
WHERE SCHEMA_NAME = 'my_schema'
GROUP BY SCHEMA_NAME;
SELECT
  EVENT_ID,
  TRX_ID,
  THREAD_ID,
  SCHEMA_NAME,
  TABLE_NAME,
  INSERT_COUNT,
  UPDATE_COUNT,
  DELETE_COUNT,
  TIME_WAIT,
  TIME_TRX,
  START_TIME
FROM performance_schema.events_transactions_history_long
ORDER BY START_TIME DESC
LIMIT 1;

特定のトランザクション ID に関連するすべてのステートメントイベントを結合

SELECT
  t.EVENT_ID,
  t.TRX_ID,
  t.THREAD_ID,
  t.SCHEMA_NAME,
  t.DIGEST_TEXT,
  s.SQL_TEXT
FROM performance_schema.events_transactions_history_long AS t
JOIN performance_schema.events_statements_summary_by_digest AS s
ON t.EVENT_ID = s.EVENT_ID
WHERE t.TRX_ID = 12345;

これらの例は、events_transactions_history_long テーブルを使用して、データベースのパフォーマンスとトランザクションアクティビティに関する貴重な洞察を得る方法を示しています。

  • Performance Schema テーブルは、大量のデータを生成する可能性があることに注意してください。分析を実行する前に、適切なサンプリングと集計を検討してください。
  • 上記のコードはほんの一例であり、ニーズに合わせて調整する必要があります。


events_transactions_history_long テーブルは、MySQL 10.5.2 以降で導入された Performance Schema の一部であり、完了したすべてのグローバルトランザクションの履歴を保持します。しかし、このテーブルにはいくつかの制限があります。

  • リアルタイムではない
    完了したトランザクションのみを記録するため、リアルタイムのトランザクションアクティビティの監視には適していません。
  • データ量が多い
    大規模なデータベースでは、events_transactions_history_long テーブルは膨大な量になり、ディスク I/O とパフォーマンスに影響を与える可能性があります。

これらの制限を克服するために、events_transactions_history_long テーブルの代替方法をいくつか検討する必要があります。

代替手段

  1. events_transactions_current テーブル

    events_transactions_current テーブルは、現在実行中のトランザクションに関する情報を提供します。 events_transactions_history_long テーブルよりも軽量で、リアルタイムのトランザクションアクティビティを監視するのに適しています。ただし、完了したトランザクションに関する情報は保持されません。

  2. 自分で実装したトランザクションログ

    アプリケーションレベルで独自のトランザクションログを実装することで、より詳細な情報を収集し、ニーズに合わせた制御を行うことができます。ただし、開発とメンテナンスの手間がかかります。

  3. サードパーティ製のツール

    SolarWinds Database Performance Monitor や Percona Monitoring Server など、データベースのパフォーマンスとトランザクションアクティビティを監視するサードパーティ製のツールがいくつかあります。これらのツールは、events_transactions_history_long テーブルよりも包括的な機能を提供する場合があります。

最適な代替手段を選択

最適な代替手段は、個々のニーズと要件によって異なります。

  • リアルタイムのトランザクションアクティビティの監視が必要な場合
    events_transactions_current テーブルまたはサードパーティ製のツールを検討してください。
  • 詳細なトランザクション情報が必要な場合
    自分で実装したトランザクションログまたはサードパーティ製のツールを検討してください。
  • ディスク I/O とパフォーマンスが懸念事項である場合
    events_transactions_current テーブルを使用するか、自分で実装した軽量なトランザクションログを検討してください。