1

MySql データベースに数百万の値を挿入するプログラムを作成します。プログラムを最適化して高速化するバッチ挿入について読みましたが、実行しようとすると同じように機能しました。データベースに各値を挿入する代わりに、毎回 500 個の値をリストに保持し、次のように 1 つの大きなループに挿入します。

for(int i=0;i<500;i++)
{
   insertData(list.get(i));
}

次に、リスト内のすべての値を削除し、再び 500 個の値の収集を開始します。それはもっとうまくいくべきではありませんか?
私の挿入コードは次のとおりです。

public void insertToNameTable(String id,String name) throws SQLException
       {
           PreparedStatement ps=null;

            ps= conn.prepareStatement("INSERT INTO NameTable values(?,?,?)",user.getId(),user.getName());


            ps.setString(1,id);
            ps.setString(2,name);
            ps.setBoolean(3,false);
            ps.executeUpdate();

       }

いくつか質問
があります。
2.高速化するには、毎回いくつの値を入力する必要がありますか?(500、1000、10000) 一緒に入力する値が多いほど良いですか?
3. データベースに値を挿入する方法が最善の方法ですか?

4

2 に答える 2

0

質問 1&2:

ユーザー Neil Coffey は以前、次のように述べています。

準備されたステートメントが主にパフォーマンスに関するものであるという考えは、か​​なり一般的なものですが、誤解のようなものです。

別の投稿者は、Oracle と SQL Server で速度が約 20% 向上したことに言及しました。MySQL で同様の図を確認しました。クエリの解析は、関係する作業の重要な部分ではないことがわかりました。非常にビジーなデータベース システムでは、クエリの解析が全体的なスループットに影響を与えるかどうかも明らかではありません。全体として、データがディスクから戻ってくる間アイドル状態になる CPU 時間を使い果たしている可能性があります。

したがって、プリペアド ステートメントを使用する理由として、SQL インジェクション攻撃に対する保護は、パフォーマンスの向上よりもはるかに重要です。そして、SQL インジェクション攻撃を心配していないのであれば、おそらく心配すべきでしょう...

元の投稿は次のとおりです:
PreparedStatements and performance
と私の意見では、すべての回答は読む価値があります。PreparedStatement挿入速度を大幅に向上させるある種の魔術師になること を期待していると思います。そのため、得られる改善に失望しています.

質問 3 :
適切な使用方法PreparedStatementは、ステートメントを準備し、値を設定してデータベースを更新するループです。良い例を次に示します。PreparedStatement を複数回再利用する

于 2014-12-18T09:40:28.640 に答える