1

.net コネクタ 6.5.4 で MySQL5.6.9-rc を使用して、2 つのフィールド (整数 ID、整数データ、ID が主キー) を持つテーブルにデータを挿入しています。テーブルに 2000 行を挿入するのに非常に時間がかかります (約 35 秒) (UpdateBatchSize = 1 と UpdateBatchSize = 500 で大きな違いはありません)。コネクタ 6.6.4 も試しましたが、問題は残ります。

ただし、MySQL5.4.3 およびコネクタ 6.20 では高速です。UpdateBatchSize を 500 に設定すると、2000 行をテーブルに挿入するのに 1 秒しかかかりません (UpdateBatchSize = 1 の場合も低速です)。次に、MySQL5.4.3 とコネクタ 6.5.4 または 6.6.4 でテストしましたが、遅いです!

以下のようにデータを挿入するコードを作成し、mysql6.6.9 およびコネクタ 6.54、Windows XP および VS2008 で実行しました。

    public void Test()
    {
        MySqlConnection conn = new MySqlConnection("Database=myDatabase;Server=localhost;User Id=root;Password=myPassword");

        string sql = "Select * from myTable";
        MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn);

        adapter.UpdateBatchSize = 500; 

        MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(adapter);

        DataTable table = new DataTable();
        adapter.Fill(table); //it is an empty table
        Add2000RowsToTable(table);

        int count = adapter.Update(table); //It took 35 seconds to complete.
        adapter.Dispose();
        conn.Close();
    }


    private void Add2000RowsToTable(DataTable table)
    {
        DataRow row;
        for (int i = 0; i < 2000; i++)
        {
            row = table.NewRow();
            row[0] = i;
            row[1] = i;

            table.Rows.Add(row);
        }
    }

MySqlDataAdapter.UpdateBatchSize がコネクタ 6.5.4 および 6.64 で機能しないように思えます。

前もって感謝します

4

3 に答える 3

1

さらにテストを行いました...

mysql サーバーのログを確認します。コネクタ 6.20 の場合、以下のような更新をバッチ処理するための sql ステートメントが生成されます。

insert into mytable (id, data) 値 (0,0),(1,1),(2,2) ...

ただし、コネクタ 6.54 と 6.64 では、ステートメントが異なります。

mytable (id, data) 値 (0,0) に挿入します。mytable (id, data) 値 (1,1) に挿入;mytable (id, data) 値 (2,2) に挿入; ...

これがコネクタ 6.5.4/6.6.4 でバッチ更新が非常に遅い理由だと思いますが、これは 6.5.4/6.6.4 のバグですか? またはサーバー(mysql 5.5.29/5.6.9を試した)はステートメントをよりスマートに処理する必要がありますか?

于 2012-12-30T03:55:58.653 に答える
1

これには最初のコーディングが少し必要ですが (問題を直接解決するわけではありません)、おそらく 100 レコードよりも長い場合は LOAD DATA INFILEを使用することを強くお勧めします。

実際、私自身のシステムでは、一度コーディングしただけで、一括かどうかにかかわらず、すべての挿入と更新に再利用しています。

LOAD DATA INFILEはるかにスケーラブルです。パフォーマンスを著しく低下させることなく、1 億行を挿入するために使用しました。

于 2012-12-26T09:21:56.627 に答える