1

我正在使用带有 .net 连接器 6.5.4 的 MySQL5.6.9-rc 将数据插入到具有两个字段(整数 ID、整数数据、ID 是主键)的表中。将 2000 行插入表中非常慢(大约 35 秒)(UpdateBatchSize = 1 和 UpdateBatchSize = 500 没有太大区别),我也尝试了连接器 6.6.4,问题仍然存在。

但是,使用 MySQL5.4.3 和连接器 6.20 速度很快,如果将 UpdateBatchSize 设置为 500,则只需一秒钟即可将 2000 行插入表中(如果 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

虽然这需要一些初始编码(并且不能直接解决您的问题),但我强烈建议对超过 100 条记录的任何内容 使用LOAD DATA INFILE 。

事实上,在我自己的系统中,我已经对其进行了一次编码,并且我将它重用于我的所有插入和更新,无论是否批量。

LOAD DATA INFILE更具可扩展性:我用它插入了 1 亿行,而没有明显的性能下降。

于 2012-12-26T09:21:56.627 回答
1

做了更多的测试...

检查 mysql 服务器中的日志,对于连接器 6.20,它会生成用于批量更新的 sql 语句,如下所示:

插入 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 回答
0

我采用的解决方案是将批量行数据作为 CSV 写入文件,然后使用以下命令导入:

LOAD DATA LOCAL INFILE  'C:/path/to/file.csv'
INTO TABLE <tablename>
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(<field1>,<field2>);

30000 行只用了大约 4 秒。它类似于上面的建议,但允许您使用系统本地的文件而不是服务器。

于 2016-04-26T05:55:58.573 回答