1

Linux マシン (768MB RAM) に MySQL 5.1x インスタンスをインストールしました。約 1000 行のバックアップを復元し、(別の Windows Web サーバーにデプロイされた) .NET アプリケーションを介して特定の読み取り操作を実行しました。テーブルにインデックスがないことを考えると、高速でした。

次に、これらの行からサーバーをクリアし、他のサーバーで自分の Web アプリケーションの機能を使用して行を挿入しました (基本的に、テキスト ファイルからテキストを読み取り、カスタム クラスのフィールドにデータを入力し、ストアド プロシージャを呼び出します)。レコードごとにこれらのパラメーターを使用します)。ローカル マシンに Web サイトとデータベースの両方がある場合、2500 行を即座に (1 秒未満で) 挿入します。ただし、「本番」環境では、これらの同じ 2500 行が挿入されるまでに 10 分かかります。MySQL のインストールに付属するデフォルトの my.cnf を使用しています。

読み取り操作の速度を犠牲にすることなく、書き込みを最適化する方法はありますか? それとも、明らかな何かが欠けていますか?

前もって感謝します!

4

2 に答える 2

2

挿入速度については、MySQL のマニュアル ページをご覧になりましたか? 私の頭に浮かぶ最初の推測は、Begin Transaction/Commitステートメントで 2500 の一連のプロシージャをラップしていないため、MySQL が 2500 のアクションのそれぞれを自動コミットしていることです。

于 2009-07-03T10:56:17.083 に答える
1

マークが言及した問題 (トランザクションではなく自動コミット) に加えて、バッチ更新を使用して調査したいと思います。ローカル接続とネットワーク接続 (非常に高速な接続であっても) の主な違いの 1 つは往復時間です。

この場合、帯域幅はおそらく制限要因ではありませんが、データベースとの間で 2500 回のネットワーク ラウンドトリップを実行すると、ローカル マシンよりもネットワークの方が明らかに時間がかかります。

バッチ更新を使用すると、これらの挿入を理想的には 1 回のラウンドトリップに減らすことができ、実際にはほんの数回に減らすことができます。

残念ながら、.NET の世界でこれらのバッチ更新を行う方法を説明することはできませんPreparedStatement.addBatch()。.NETにも似たようなものがあると確信しています。

于 2009-07-03T11:04:44.753 に答える