web-dev-qa-db-ja.com

ロギングはMySQLのパフォーマンスを損ないます-しかし、なぜですか?

これに対する答えがサイトのどこにも、MySQLのドキュメントにも見当たらないことに非常に驚いています( セクション5.2 他の方法では十分にカバーされているようです!)

Binlogを有効にすると、(主観的に)小さなパフォーマンスの低下が見られます。これは少し余分なIO-ですが、一般的なクエリログを有効にすると、非常に大きなパフォーマンスが見られます。ヒット(クエリの実行時間の2倍、またはそれ以上)は、binlogで表示される時間をはるかに超えています。もちろん、すべてのSELECTとすべてのUPDATE/INSERTをログに記録していますが、他のデーモンはすべてのリクエストを記録しています(Apache 、Exim)停止するまで粉砕せずに。

IOに関しては、パフォーマンスの「転換点」に近いことの影響を見ているだけですか、それとも、これを引き起こすクエリのログ記録に関して根本的に難しいことがありますか?開発を容易にするためにすべてのクエリをログに記録できるようにしたいと思いますが、一般的なクエリのログオンでパフォーマンスを回復する必要があると思われるハードウェアの種類を正当化することはできません。

もちろん、私は遅いクエリをログに記録します。これを無効にすると、一般的な使用法の改善はごくわずかです。

(これはすべてUbuntu 10.04 LTS、MySQLd 5.1.49にありますが、調査によると、これはかなり普遍的な問題です)

9
James Green

一般的なクエリログはロットバイナリログよりもIOです。ほとんどのSQLサーバーは90%の読み取りから10%の書き込みであるという事実に加えて、バイナリログは使用するディスク容量が少ないプレーンテキストではなくバイナリ形式(どれだけ少ない容量ですか?わかりません。申し訳ありません。)

ApacheとEximがパフォーマンスに大きな影響を与えることなくすべてのリクエストを記録できる理由には2つの側面があります。 1つ目は、リクエストが発生したという事実を記録しますが、ログに記録する内容は通常、実際のリクエストよりも大幅に小さいことです。 HTTPリクエストは、多くの場合、ログに記録される行の2倍の大きさであり、短いプレーンテキストの電子メールでさえ、それに付随するログ行の10倍または20倍の大きさです。 10MBの添付ファイルが付いた電子メールには、ログに数行しか書き込まれません。

これの2番目の部分は、通常のWebアプリケーションでは、通常、単一のHTTPページに関連付けられた数十のSQLクエリがあることです。電子メールは、HTTP要求よりもさらに少ない数になる傾向があります。 MySQLサーバーは、おそらくApacheまたはEximよりもはるかに多くのログを記録しようとしています。

1日の終わりに、MySQLバイナリログと一般ログ、およびApacheログとEximログのサイズ(非圧縮)を確認します。 MySQLの一般ログは少なくとも5倍で最大のものであることがわかると思います。

9
Ladadadada

提供されている answer に追加するには、MySQLデータストアが存在するのと同じデバイスにログを記録している場合にもパフォーマンスの低下が見られます-同じディスクの場合は、次のようになります。常に複数の場所で読み取りと書き込みを行うため、プロセス全体が遅くなります。

これは、同じ物理ディスク上の別のパーティションであっても当てはまります。

ロギングが別のデバイスに送信される場合は、パフォーマンスの問題の一部が軽減されるはずです。

4
warren