したがって、スロー クエリ ログについての私の理解では、my.conf ファイルで設定した時間 (秒単位) を超えるすべてのクエリに関する情報がログに記録されるということです。
次に、3 つの異なる SELECT クエリの 3 つのケースを考えてみましょう (INNODB エンジンを使用したテーブルに対して):
クエリ I: Query_time: 32.937667 Lock_time: 0.000081 Rows_sent: 343 Rows_examined: 12714043
クエリ II: Query_time: 12.937667 Lock_time: 0.000081 Rows_sent: 43 Rows_examined: 714043
クエリ III: Query_time: 42.937667 Lock_time: 0.000081 Rows_sent: 18 Rows_examined: 483
私には、QUERY I と QUERY II の両方が、不適切なクエリ、不適切なインデックス作成 (またはインデックス作成の欠落)、または断片化されたテーブル データなどの可能性のあるケースのように見えます (見逃した可能性のあるものは他にありますか?)。 .
しかし、QUERY III の場合、私は頭を悩ませることができません。つまり、483 行を調べて 18 行を送り返すのに 42 秒かかる (ごくわずかなロック時間で) DB に実際に問題がある可能性があることを意味します。断続的に起こっているのを見ると、これはさらに混乱します。
ですから、ここで本当に聞きたいのは次のことです。
- ロック時間情報をどのように解釈すればよいですか? 実際に実行を開始する前に、クエリが何秒も待たなければならなかったということですか? はいの場合、私の例のクエリ III では、実際に 483 行を調べるのに 42 秒かかり、そのうちの 18 行を送り返しましたか?
- ロック時間はごくわずかですが、クエリ時間は非常に長く、数百行しか調べられずに返送される場合、どこから問題を探し始めればよいでしょうか?
- クエリがバックグラウンド IO アクティビティに多くの時間を費やしている可能性がありますか? ロギングまたはビンロギングと言います。
- テーブルのサイズはクエリのパフォーマンスにどの程度影響しますか? たとえば、MySQL は 2 億行以上のテーブルを処理するのに十分であると言えますか?
- DB のバックグラウンド アクティビティを把握するために特別に DB アクティビティを監視するためのより良いツールまたは方法はありますか? 要するに、そのクエリがほとんどの時間を費やしている場所を確認することです。
このような遅いクエリに影響を与える要因は多数ある可能性があります。そのため、私を助けるためにサイドからの情報がさらに必要であると思われる場合は、お知らせください。