Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


MySQL 8.0 リファレンスマニュアル  /  MySQL パフォーマンススキーマ  /  問題を診断するためのパフォーマンススキーマの使用

このページは機械翻訳したものです。

27.19 問題を診断するためのパフォーマンススキーマの使用

パフォーマンススキーマは、DBA が大まかな推量ではなく、実際に測定して、パフォーマンスのチューニングを行うのに役立つツールです。 このセクションでは、この目的でパフォーマンススキーマを使用するいくつかの方法について説明します。 ここでの説明は、セクション27.4.2「パフォーマンススキーマイベントフィルタリング」で説明しているイベントフィルタリングの使用に依存します。

次の例では、パフォーマンスボトルネックの調査など、反復される問題の分析に使用できる 1 つの方法を示しています。 開始するには、パフォーマンスが遅すぎるとみなされ、最適化が必要な反復可能なユースケースが必要であり、すべてのインストゥルメンテーションを有効にすべきです (事前フィルタリングなし)。

  1. ユースケースを実行します。

  2. パフォーマンススキーマテーブルを使用して、パフォーマンスの問題の原因を分析します。 この分析は、フィルタリング後に大きく依存します。

  3. 除外する問題領域については、対応するインストゥルメントを無効にします。 たとえば、問題が特定のストレージエンジンのファイル I/O に関連していないことが分析に示されている場合、そのエンジンのファイル I/O インストゥルメントを無効にします。 次に、履歴およびサマリーテーブルを切り捨て、これまでに収集されたイベントを削除します。

  4. ステップ 1 のプロセスを繰り返します。

    反復のたびに、パフォーマンススキーマの出力 (特に events_waits_history_long テーブル) に含まれる「ノイズ」の数が少なく、重要でないインストゥルメントによって発生する「ノイズ」が少なくなり、このテーブルのサイズが固定されている場合は、手動での問題の分析に関連するより多くのデータが含まれます。

    signal/noise 比率が改善され、分析が容易になるため、反復ごとに調査が問題の根本原因に近づいて近づく必要があります。

  5. パフォーマンスボトルネックの原因を突き止めたら、次のような適切な修正措置をとります。

    • サーバーパラメータ (キャッシュサイズ、メモリーなど) をチューニングします。

    • クエリーを違う方法で書いてチューニングします。

    • データベーススキーマ (テーブル、インデックスなど) をチューニングします。

    • コードをチューニングします (これはストレージエンジンまたはサーバー開発者のみに適用されます)。

  6. ステップ 1 から再開して、パフォーマンスへの変更の効果を確認します。

mutex_instances.LOCKED_BY_THREAD_ID および rwlock_instances.WRITE_LOCKED_BY_THREAD_ID カラムは、パフォーマンスボトルネックまたはデッドロックの調査にきわめて重要です。 これは、次のようなパフォーマンススキーマインストゥルメンテーションによって可能になります。

  1. スレッド 1 は相互排他ロックを待機してスタックしているとします。

  2. スレッドが何を待機しているかを特定できます。

    SELECT * FROM performance_schema.events_waits_current
    WHERE THREAD_ID = thread_1;

    たとえば、events_waits_current.OBJECT_INSTANCE_BEGIN にあるように、スレッドが相互排他ロック A を待機していることがクエリー結果に示されます。

  3. 相互排他ロック A を保持しているスレッドを特定できます。

    SELECT * FROM performance_schema.mutex_instances
    WHERE OBJECT_INSTANCE_BEGIN = mutex_A;

    たとえば、mutex_instances.LOCKED_BY_THREAD_ID にあるように、相互排他ロック A を保持しているのがスレッド 2 であることがクエリー結果に示されます。

  4. スレッド 2 が何を実行しているかを確認できます。

    SELECT * FROM performance_schema.events_waits_current
    WHERE THREAD_ID = thread_2;