首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL .Net/连接器6.5.4/6.6.4的批处理更新速度非常慢

MySQL .Net/连接器6.5.4/6.6.4的批处理更新速度非常慢
EN

Stack Overflow用户
提问于 2012-12-26 17:15:36
回答 3查看 1.2K关注 0票数 1

我使用MySQL5.6.9-rc和.net连接器6.5.4将数据插入到一个有两个字段(整数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运行它。

代码语言:javascript
复制
    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不起作用,是不是我的代码出了什么问题?

提前感谢

EN

回答 3

Stack Overflow用户

发布于 2012-12-26 17:21:57

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

实际上,在我自己的系统中,我只编写了一次代码,并且在我的所有插入和更新中都重用了它,无论是否批量。

LOAD DATA INFILE的可伸缩性要好得多:我已经用它插入了一亿行,而没有明显的性能下降。

票数 1
EN

Stack Overflow用户

发布于 2012-12-30 11:55:59

做了更多的测试...

检查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的bug吗?或者服务器(尝试过mysql 5.5.29/5.6.9)应该更智能地处理语句?

票数 1
EN

Stack Overflow用户

发布于 2016-04-26 13:55:59

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

代码语言:javascript
复制
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秒。它类似于上面的建议,但允许您使用系统本地的文件,而不是服务器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14038369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档