ログ記録は MySQL のパフォーマンスを低下させますが、それはなぜでしょうか?

ログ記録は MySQL のパフォーマンスを低下させますが、それはなぜでしょうか?

この質問に対する答えがサイトのどこにも見当たらず、MySQLのドキュメントにも見当たらないのには驚きました(セクション5.2ログ記録はそれ以外は十分にカバーされているようです。)

binlogs を有効にすると、パフォーマンスがわずかに低下します (主観的)。これは、IO が少し増えることから予想されることです。ただし、一般的なクエリ ログを有効にすると、パフォーマンスが大幅に低下します (クエリの実行時間が 2 倍になるか、さらに悪化します)。これは、binlogs の場合よりもはるかに大きな値です。もちろん、すべての SELECT とすべての UPDATE/INSERT をログに記録していますが、他のデーモン (Apache、Exim) は、停止することなくすべてのリクエストを記録します。

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

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

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

答え1

一般的なクエリログは多くバイナリ ログよりも IO が多くなります。ほとんどの SQL サーバーが 90% 読み取り、10% 書き込みであるという事実に加えて、バイナリ ログはプレーン テキストではなくバイナリ形式で保存されるため、ディスク領域が少なくて済みます。(どのくらい領域が節約されるかはわかりません。申し訳ありません。)

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

2 つ目の理由は、通常の Web アプリケーションでは、1 つの HTTP ページに関連付けられた SQL クエリが数十個あることが一般的であるということです。電子メールは、HTTP リクエストよりもさらに少ない数で送信される傾向があります。MySQL サーバーは、Apache や Exim よりもはるかに多くのログを記録しようとしている可能性があります。

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

答え2

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

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

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

関連情報