web-dev-qa-db-ja.com

MySQLによって生成された遅いクエリログ情報を解釈する方法は?

したがって、遅いクエリログについての私の理解は、my.confファイルに設定した時間(秒単位)以上かかったすべてのクエリに関する情報をログに記録するということです。

ここで、(INNODBエンジンを使用するテーブルに対して)3つの異なるSELECTクエリの3つのケースを取り上げましょう。

QUERY I: Query_time:32.937667 Lock_time:0.000081 Rows_sent:343 Rows_examined: 12714043

QUERY II: Query_time:12.937667 Lock_time:0.000081 Rows_sent:43 Rows_examined: 714043

QUERY III: Query_time:42.937667 Lock_time:0.000081 Rows_sent:18 Rows_examined: 483

私には、QUERYIとQUERYIIの両方が、クエリの実行時間を改善するためにユーザーが確認する可能性のある、クエリの不良、インデックスの不良(またはインデックスの欠落)、テーブルデータの断片化など(他に見逃している可能性があるもの)の可能性のあるケースのように見えます。 。

しかし、QUERY IIIの場合、頭を動かすことができません。つまり、DBの実際の問題点は483行を調べて18行を送り返すのに42秒かかることです(ロック時間はごくわずかです)。これが断続的に発生するのを見ると、これはさらに混乱します。

だから私がここで本当に聞きたいのは:

  • ロック時間情報をどのように解釈すればよいですか?クエリが実際に実行を開始する前に、その秒数待機する必要があったということですか?はいの場合、私の例では、クエリIIIは実際に483行を調べるのに42秒かかり、そのうち18行を送り返しましたか?
  • ロック時間が無視できるが、それでもクエリ時間が非常に長く、数百行が検査されて返送される場合、どこで問題を探し始める必要がありますか?
  • クエリがバックグラウンドで多くの時間を費やしている可能性がありますIOアクティビティ?ロギングまたはビンロギングと言います。
  • テーブルのサイズがクエリのパフォーマンスにどの程度悪影響を与える可能性がありますか?例えばMySQLは2億行以上のテーブルを処理するのに十分であると言えますか
  • DBのバックグラウンドアクティビティを把握するために、特にDBアクティビティを監視するためのより良いツールまたは方法はありますか?要するに、そのクエリがほとんどの時間を費やしている場所を確認することです。

このような遅いクエリに影響を与える要因はたくさんあるかもしれませんので、私を助けるために側からさらに情報が必要だと感じた場合は、私に知らせてください。

13
sactiw
  • ロック時間は、クエリの実行を開始する前に費やした時間です。つまり、他のスレッドが現在のクエリでロックする必要のあるデータのロックを放棄するのを待つ時間です。

  • クエリ時間はクエリを実行する時間です。これには、行がまだバッファプールにない場合、I/Oの待機が含まれる場合があります。データがバッファプールにロードされた後、同じデータに対して同じクエリを繰り返す方が高速な場合があります。

    クエリが特定のクエリに対してディスク上で並べ替えている場合、数行を調べても処理が遅くなります。

    I/Oシステムに過大な負担がかかると、断続的に速度が低下する可能性があります。これは、仮想化されたI/O(たとえば、安価なAWSインスタンス)でも発生する可能性があります。または、ディスクに障害が発生し始めている場合は、断続的にエラーが発生する可能性があります。

    iostatを監視し、キューの長さ、平均待機時間、およびサービス時間を監視します。速度が低下する期間があるかどうか、またはパフォーマンスとスループットがほぼ一貫しているかどうかを確認します。

  • 調べた行は、特定の行をフェッチするために必要な複数のI/Oを反映していません。たとえば、行にオーバーフローページに格納されている大きなBLOB/TEXT/VARCHAR列が多数ある場合です。または、トランザクションがロールバックセグメントにアクセスして一部の行の古いバージョンをフェッチする必要がある場合、このトランザクションの開始以降に変更されている場合。

    調べた行からも、クエリ内の式がどれほど複雑かはわかりません。 保存された関数のフィボナッチ数列 またはそのようなクレイジーなものを計算している可能性があります。

    クエリとそのEXPLAINレポートを確認せずに、遅いクエリログからの数値のみを考えると、遅いことを説明するための一般化を行うことは困難です。

MySQLは確かに2億行をテーブルに格納できますが、その規模では、インデックスによって検索が483行に減る場合でも、パフォーマンスの問題が発生し始めます。これは、 Bツリーインデックスの深さとインデックス付き列のサイズ が、これらの483行を検索するために必要なI/O操作の数に直接関係しているためです。 I/Oが多いほど、時間がかかります。これは、調べた行には反映されません。クエリ時間にはI/O時間が含まれますが、クエリ時間のどれだけがI/Oによるものかは明確ではありません。

より詳細な診断を探すための他のいくつかの場所は次のとおりです。

26
Bill Karwin

Query_time:12.937667 Lock_time:0.000081 Rows_sent:43 Rows_examined:714043

Query Time: Total time including lock time query has taken

Lock_Time: Total query query was in a locked state

Rows sent: Total rows sent by server to client

Rows examined: Total rows scanned by a MySQL server for a query
2
user2332130