したがって、遅いクエリログについての私の理解は、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秒かかることです(ロック時間はごくわずかです)。これが断続的に発生するのを見ると、これはさらに混乱します。
だから私がここで本当に聞きたいのは:
このような遅いクエリに影響を与える要因はたくさんあるかもしれませんので、私を助けるために側からさらに情報が必要だと感じた場合は、私に知らせてください。
ロック時間は、クエリの実行を開始する前に費やした時間です。つまり、他のスレッドが現在のクエリでロックする必要のあるデータのロックを放棄するのを待つ時間です。
クエリ時間はクエリを実行する時間です。これには、行がまだバッファプールにない場合、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によるものかは明確ではありません。
より詳細な診断を探すための他のいくつかの場所は次のとおりです。
MySQLクエリプロファイラー (ただし、パフォーマンススキーマを優先して非推奨になっていることに注意してください)
Percona Serverの拡張された冗長性の遅いクエリログ クエリがI/Oの待機に費やした時間を報告します。
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