スロークエリはリソースをロックし、他のセッションをブロックするため、クラスター全体のスループットが低下します。PolarDB for MySQL は、デフォルトで実行に 1 秒以上かかる SQL ステートメントをスロークエリとしてフラグ付けします。コンソールの [スロー SQL] ページには、ログ分析、自動最適化の提案、クエリガバナンスという 3 つの補完的なビューがあり、コンソールから離れることなく、パフォーマンスボトルネックを特定し、優先順位を付け、修正することができます。
スロークエリをトリアージする際に最も役立つ 2 つのメトリックは次のとおりです。
実行時間:リソースを長時間保持し、他のセッションをブロックするクエリを特定します。
呼び出し回数:個々の呼び出しが高速であっても、累積レイテンシが高くなる頻繁に実行されるクエリを特定します。
前提条件
開始する前に、ご利用のアカウントに AliyunHDMFullAccess 権限があることを確認してください。きめ細かなアクセス制御については、「特定の権限を付与するためのカスタム RAM ポリシーの作成」をご参照ください。
スロー SQL クエリの表示
PolarDB コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。クラスターが配置されているリージョンを選択し、クラスター ID をクリックします。
左側のナビゲーションウィンドウで、[診断と最適化] > [スロー SQL] を選択します。
[スロー SQL] ページには、[スローログ分析]、[自動 SQL 最適化の提案]、[クエリガバナンス] の 3 つのタブがあります。
スローログ分析
[スローログ分析] タブには、選択した時間範囲のスロークエリの傾向と統計が表示されます。
時間範囲の制約:
終了時刻は開始時刻より後である必要があります。
間隔は 24 時間を超えることはできません。
ログは最大で過去 1 か月分利用可能です。
このタブには 4 つのセクションがあります。
スロークエリログの傾向:時間経過に伴うスロークエリ量の傾向チャートを表示します。チャート上の任意のポイントをクリックすると、その時点の統計と詳細が表示されます。
UI で SQL ステートメントが切り捨てられている場合は、その上にカーソルを合わせると全文が表示されます。
イベントのディストリビューション:選択した時間範囲内のスロークエリイベントのディストリビューションを表示します。イベントをクリックすると、その詳細が表示されます。[ノード ID] ドロップダウンを使用して、クラスターノードごとに結果をフィルターします。
次の操作も可能です。
をクリックして、スロークエリログをコンピューターにダウンロードします。
をクリックして、現在のパラメーターを OpenAPI コンソールに送信し、API デバッグを行います。
スロークエリログ統計:スロークエリを SQL テンプレートごとにグループ化します。SQL テンプレートは、リテラル値がプレースホルダーに置き換えられたクエリのパラメーター化されたバージョンです。たとえば、SELECT * FROM orders WHERE user_id = ? は、実際のユーザー ID に関係なく、そのテーブルに対するすべてのクエリを表すテンプレートです。このグループ化により、何千もの個別の実行にわたるパターンを特定できます。
このセクションでは:
リストの上部でフィルター条件を設定します。利用可能なフィルターはデータベースエンジンによって異なります。
[SQL ID] をクリックすると、そのテンプレートのユーザーディストリビューション、クライアントディストリビューション、およびメトリクスの傾向が表示されます。
[アクション] 列の [最適化] をクリックして、[SQL 診断の最適化] ダイアログを開きます。DAS は、SQL ステートメントの複雑さ、テーブル内のデータ量、およびデータベースの負荷に基づいて SQL 診断を実行します。SQL 診断が実行されてから 20 秒以上経過してから提案が返される場合があります。提案を受け入れる場合は、[コピー] をクリックして、最適化された SQL をデータベースクライアントまたは Data Management (DMS) に貼り付けて実行します。
[アクション] 列の [スロットリング] をクリックして、SQL スロットリングを設定します。設定の詳細については、「SQL スロットリング」をご参照ください。
PolarDB for MySQL クラスターの場合、[アクション] 列の [IMCI] をクリックして、インメモリ列指向インデックス (IMCI) 機能のドキュメントを表示します。
[IMCI] ボタンは、クラスターに IMCI ノードが購入されておらず、SQL テンプレートの最大実行時間が 20 秒を超え、スキャンされた最大行数が 200,000 を超えるという 3 つの条件がすべて満たされた場合にのみ表示されます。大量のデータをスキャンする複雑なクエリのパフォーマンスを向上させるには、IMCI を使用します。
スロークエリログの詳細:個々のスロークエリの実行を表示します。[アクション] 列の [最適化] または [スロットリング] をクリックして、特定のステートメントに対して SQL 診断を実行するか、スロットリングを設定します。
自動 SQL 最適化の提案
[自動 SQL 最適化の提案] タブで、期間を選択してその期間の最適化の提案を確認します。
[自動 SQL 最適化を有効にする] は、問題のある SQL ステートメントを自動的に特定し、インデックス最適化の推奨事項を生成し、テーブルロックを引き起こすことなくインデックスを作成します。
詳細については、「自動 SQL 最適化」をご参照ください。
クエリガバナンス
[クエリガバナンス] タブでは、クラスター全体のクエリの状態を把握できます。
[クエリガバナンス結果の概要]:システムタギング後のクエリ分類結果を表示します。
失敗した SQL 実行は、DAS Enterprise Edition が有効になっているインスタンスでの失敗のみをカウントします。
クエリガバナンスの傾向 — 選択した期間におけるクエリガバナンスの結果の変化を示します。
上位ランキング:パフォーマンス上位インスタンスと最もパフォーマンスの低いインスタンスをハイライトします。
最もパフォーマンスの低いインスタンス:スロークエリを引き起こす SQL ステートメントの実行回数を表示します。
パフォーマンス上位インスタンス:スロークエリ実行回数の変化を表示します。負の値はスロークエリの数が減少したこと (良好な最適化効果) を意味し、正の値は増加したことを意味します。
最適化可能な SQL を確認する際は、パフォーマンスが最も良いインスタンスと最も悪いインスタンスに注目してください。
最適化する SQL:フィルターを使用して、注意が必要な SQL ステートメントを絞り込みます。4 つのフィルターはすべて AND ロジックで結合されます。
| フィルター | 区切り文字 | 演算子 |
|---|---|---|
| データベース名 | カンマ (,) | OR |
| SQL キーワード | スペース | AND |
| データベースのユーザー名 | カンマ (,) | OR |
| ルールタグ | 複数選択 | OR |
各 SQL サンプルで利用可能なアクション:
提案:詳細なガバナンスの推奨事項を表示します。
タグの追加:SQL ステートメントに手動でタグを付けます。タグの定義については、「手動で追加できる SQL タグ」をご参照ください。複数の SQL サンプルを選択して、バッチでタグを追加します。
[サンプル]:この SQL のスローログサンプルの詳細を表示します。
傾向:スローログ分析の詳細を表示します。詳細については、「スロークエリログ」をご参照ください。
必要に応じて、最適化が必要な SQL ステートメントをエクスポートして共有します。詳細については、「スロークエリログ」をご参照ください。
失敗した SQL:データベース名 (カンマ区切り、OR ロジック) または SQL キーワード (スペース区切り、AND ロジック) で失敗した SQL ステートメントをフィルターします。
失敗した SQL は、DAS Enterprise Edition が有効になっているインスタンスでの失敗のみをカウントします。
[アクション] 列の [サンプル] をクリックして、失敗したステートメントの実行詳細を表示します。
スロークエリのしきい値の調整
デフォルトのスロークエリのしきい値は 1 秒です。これを変更するには、PolarDB コンソールで [設定と管理] > [パラメーター] に移動し、long_query_time パラメーターを設定します。
| パラメーター | 説明 | デフォルト | 範囲 | 単位 |
|---|---|---|---|---|
long_query_time | この値を超えるすべてのクエリをスロークエリログに記録します | 1 | 0.03–31,536,000 | 秒 |
手順については、「クラスターとノードのパラメーターの指定」をご参照ください。
よくある質問
スロークエリログの実行完了時間が実際の実行時間と異なるのはなぜですか?
これは、SQL ステートメントがセッションレベルのタイムゾーンを変更した場合に発生します。PolarDB は、セッション、データベース、システムの 3 つのレベルのタイムゾーンに基づいて実行完了時間を記録します。データベースにタイムゾーンが指定されている場合、実行完了時間はデータベースのタイムゾーンに基づいて記録されます。それ以外の場合は、システムのタイムゾーンに基づいて記録されます。SQL ステートメントが実行中にセッションのタイムゾーンを変更すると、記録されたタイムスタンプが正しく変換されない場合があります。
スロー SQL クエリを見つけるにはどうすればよいですか?
2 つのオプションがあります。
この記事で説明されているように、コンソールの [スロー SQL] ページでスロークエリログを直接表示します。
クラスターに接続し、
show processlistを実行して現在実行中のステートメントを確認します。接続手順については、「データベース接続」をご参照ください。
API リファレンス
| API | 説明 |
|---|---|
| DescribeSlowLogs | PolarDB for MySQL クラスターのスロークエリログに関する統計を照会します |
| DescribeSlowLogRecords | PolarDB for MySQL クラスターのスロークエリログの詳細を照会します |
| DescribeDBClusterAuditLogCollector | PolarDB for MySQL クラスターで SQL データコレクターが有効になっているかどうかを照会します。SQL データコレクターの機能には、監査ログと SQL Explorer が含まれます。 |
| ModifyDBClusterAuditLogCollector | PolarDB for MySQL クラスターの SQL データコレクターを有効または無効にします。SQL データコレクターの機能には、監査ログと SQL Explorer が含まれます。 |