5

単一の MySQL テーブル (ユーザー アクティビティ情報を格納する) への単純な更新の一定のストリームがあります。これらを毎秒バッチ更新にグループ化するとしましょう。

典型的な 4 コア 8 GB ボックスの mysql が、毎秒更新に追いつくのに問題が発生し始める時期について、大まかなアイデアが必要です。たとえば、毎秒 @ 1 で何行の更新を行うことができますか?

これは、アプリケーション リリースの初期に MySQL を使用するべきか (開発を簡素化するため)、または MySQL がすぐに爆発してその道を冒険する価値さえなくなる可能性があるかどうかを判断するための思考演習です。

4

3 に答える 3

7

適切な数値を得る唯一の方法は、特定のユース ケースをベンチマークすることです。変数が多すぎて、それを回避する方法はありません。

bash スクリプトまたは小さなデモアプリをノックしてjmeterで叩くだけでも、それほど時間はかからないはずです。そうすれば、良いアイデアが得られます。

同様のユースケースのベンチマークを試みるときに jmeter を使用しました。違いは、数の書き込みスループットを探していたことですINSERTS。私が遊んでいるときに出てきた最も便利なものは、「innodb_flush_log_at_trx_commit」パラメーターでした。ユース ケースで ACID コンプライアンスを使用INNODBていて必要ない場合は、それを 0 に変更します。これにより、INSERTスループットに大きな違いが生じ、UPDATEユース ケースでも同じことが起こる可能性があります。ただし、この設定では、変更は 1 秒に 1 回しかディスクにフラッシュされないため、サーバーの電源が切断されたり何かが発生した場合、数秒分のデータが失われる可能性があることに注意してください。

私のユースケースのクアッドコア8GBマシンで:

  • innodb_flush_log_at_trx_commit=11 秒あたり 80 個の INSERTS が発生しました
  • innodb_flush_log_at_trx_commit=01 秒あたり 2000 INSERTS になりました

これらの数値は、おそらくユース ケースとは関係ありません。そのため、自分でベンチマークする必要があります。

于 2012-10-11T11:53:47.127 に答える
2

その多くは、DB にプッシュするために使用するコードの品質に依存します。

INSERTリクエストごとに単一の値を挿入するようにバッチを記述する場合(つまり、

INSERT INTO table (field) VALUES (value_1);
INSERT INTO table (field) VALUES (value_2);
...
INSERT INTO table (field) VALUES (value_n);

、パフォーマンスがクラッシュして燃えます。

単一の値を使用して複数の値を挿入する場合INSERT(つまり

INSERT INTO table (field) values (value_1),(value_2)...(value_n);

、1秒間に多くのレコードを簡単に挿入できることがわかります

例として、LDAP アカウントの要求の詳細を保持 DB に追加する必要がある簡単なアプリを作成しました。一度に 1 つのフィールド (つまりLDAP_field, LDAP_value) を挿入すると、スクリプト全体の実行に数十秒かかりました。値を 1 つの INSERT リクエストに連結すると、スクリプトの実行時間は開始から終了まで約 2 秒に短縮されました。これには、トランザクションの開始とコミットのオーバーヘッドが含まれていました

お役に立てれば

于 2012-10-11T11:50:54.960 に答える
2

この質問に一般的な答えを出すのは簡単ではありません。要求する数値は、データベース サーバーのハードウェア、MySQL 自体だけでなく、サーバー/クライアントの構成、ネットワーク、および同様に重要なデータベース/テーブルの設計にも大きく依存します。

一般的に言えば、最新のサーバー上にネイキッド MySQL をセットアップし、一意のキーを使用してステートメントを更新すると、200 個の update-statements/秒未満で問題が発生することはありませんlocalhost。私の6年前のwinxpテスト環境で。新しいシステムにネイキッド インストールを行うと、このように拡張されます。より大きなものを考える場合、1 つのサーバーは適していません。MySQL はいくつかの方法で調整およびスケールアウトできるため、多くの企業が MySQL に大きく依存しています。

いくつかの基本事項:

  • 更新するフィールドに巨大なインデックス ファイルがある場合、各ステートメントはデータだけでなくインデックス情報も書き込む必要があるため、更新ステートメントは非常に遅くなります。
  • update ステートメントでインデックスを使用できない場合、サーバーが更新する必要のあるフィールドを割り当てるのに時間がかかることがあります。
  • メモリやハードディスクの速度が遅いと、サーバー全体のパフォーマンスが低下する場合もあります。
  • ネットワーク接続が遅いと、クライアントとサーバー間の通信が遅くなります。

それについて書かれた本全体があるので、興味があれば、ここでやめて、さらに読むことをお勧めします!

于 2012-10-11T11:49:55.287 に答える