2025/03/21 21:18 MySQL transactions per second vs. fsyncs per second

ロボ子、今日のITニュースはMySQLのトランザクション性能についての記事じゃ。

MySQLのトランザクション性能ですか。興味深いですね。

記事によると、MySQLの1秒あたりの最大トランザクション数は、1秒あたりのfsync数とほぼ同じらしいのじゃ。

fsyncですか。データをディスクに書き込む処理ですね。

そうじゃ。MySQLはトランザクションをコミットする際に、WAL(Write-Ahead Logging)に書き込んで、fsyncを呼び出すのじゃ。記事には「MySQLは2相コミットを使用しており、トランザクションをコミットするには3つのfsyncが必要」とあるぞ。

トランザクションごとにfsyncを実行すると、オーバーヘッドが大きそうですね。

その通り!でも、MySQLはグループコミットというテクニックを使って、複数のトランザクションをまとめてfsyncすることで、スループットを向上させているのじゃ。

グループコミットですか。複数の書き込みをまとめて処理するのですね。

記事によると、グループコミットによって約16,000トランザクションが約2885コミットに削減されたらしいぞ。平均して1コミットあたり約5.5トランザクションじゃ。

それはすごい改善ですね。ファイルシステムやディスクも、同様のバッチ処理を行っている可能性があるのですね。

その通り!ext4もMySQLのグループコミットと同様のテクニックを使用している可能性があると記事には書いてあるのじゃ。

なるほど。トランザクション性能のボトルネックは、fsyncの回数だけでなく、そのバッチ処理の効率にも依存するということですね。

そういうことじゃ!それから、インデックスに関する興味深い考察もあったぞ。titleに200万件、seeに100万件のIDがある場合、title AND seeのIDを取得するのにかかる時間は?というものじゃ。

単純なセット交差アルゴリズムを使用すると、約24Mbのメモリをスキャンする必要があり、約2.4msで実行可能とのことですね。

そうじゃ。Luceneの夜間ベンチマークでは、これらのクエリを約22 QPSで実行しているらしい。つまり、クエリあたり45msじゃ。

Luceneの方が遅い原因は不明なのですね。

記事にはそう書いてあるのじゃ。さらに、title AND seeの結果を各ドキュメントの最終更新日で並べ替える場合、最悪の場合、約24Mbのメモリをソートする必要があり、約120msかかる可能性があると。

インデックスの設計やデータの保存順序が、クエリ性能に大きく影響することがわかりますね。

その通り!データベースの性能チューニングは奥が深いぞ。ところでロボ子、今日の夕食は何が良いかのじゃ?

博士、またご飯の話ですか...。データベースの話から急に変わりますね。

だって、お腹が空いたのじゃもん!それに、データベースの最適化も、美味しいご飯を作るのと同じくらい重要じゃぞ!

まあ、そうかもしれませんけど...。今日は、データベースみたいに、色々な要素が組み合わさったカレーはいかがですか?

カレーか!良いのじゃ!でも、ロボ子が作るカレーは、いつもちょっとだけ味が足りない気がするのじゃ…まるで、インデックスが最適化されていないデータベースみたいじゃな!

もー!博士ったら!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。