我使用MySQL5.6.9-rc和.net connector 6.5.4将数据插入到一个有两个字段(Integer ID,Integer data,ID是主键)的表中。向表中插入2000行非常慢(大约35秒)(UpdateBatchSize=1和UpdateBatchSize=500没有太大区别),我还尝试了连接器6.6.4,问题仍然存在。
不过,MySQL5.4.3和connector 6.20的速度很快,如果将UpdateBatchSize设置为500(如果UpdateBatchSize=1,则速度也很慢),只需一秒钟就可以向表中插入2000行。然后我用MySQL5.4.3和连接器6.5.4或6.6.4测试它,它很慢!
我编写了如下代码来插入数据,使用mysql6.6.9和connector 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不起作用,我的代码有问题吗?
提前谢谢

最佳答案

虽然这需要一点初始编码(并且不能直接解决您的问题),但我强烈建议对于超过100条记录的任何内容使用LOAD DATA INFILE
事实上,在我自己的系统中,我只编写了一次代码,并将其用于所有的插入和更新,无论是否是大容量的。
LOAD DATA INFILE的可伸缩性要高得多:我用它插入了1亿行而没有明显的性能下降。

10-07 23:14