一尘不染

将DataTable批量复制到MySQL中(类似于System.Data.SqlClient.SqlBulkCopy)

mysql

我正在将程序从Microsoft SQL Server迁移到MySQL。一切正常,除了批量复制存在一个问题。

在使用MS SQL的解决方案中,代码如下所示:

connection.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(connection);
bulkCopy.DestinationTableName = "testTable";
bulkCopy.WriteToServer(rawData);

现在,我尝试为MySQL做类似的事情。因为我认为性能会很差,所以我不想将DataTable写入CSV文件,并使用MySqlBulkLoader该类从那里进行插入。

任何帮助将不胜感激。


阅读 464

收藏
2020-05-17

共1个答案

一尘不染

因为我认为性能会很差,所以我不想将DataTable写入CSV文件并使用MySqlBulkLoader类从那里进行插入。

不要根据无根据的假设排除可能的解决方案。我只是测试的从100,000行插入System.Data.DataTable使用标准到MySQL表MySqlDataAdapter#Update()Transaction。持续大约需要30秒才能运行:

using (MySqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        cmd.Connection = conn;
        cmd.Transaction = tran;
        cmd.CommandText = "SELECT * FROM testtable";
        using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
        {
            da.UpdateBatchSize = 1000;
            using (MySqlCommandBuilder cb = new MySqlCommandBuilder(da))
            {
                da.Update(rawData);
                tran.Commit();
            }
        }
    }
}

(我尝试了几个不同的值,UpdateBatchSize但它们似乎对经过时间没有重大影响。)

相比之下,下面的代码使用MySqlBulkLoader只花了5到6秒钟即可运行…

string tempCsvFileSpec = @"C:\Users\Gord\Desktop\dump.csv";
using (StreamWriter writer = new StreamWriter(tempCsvFileSpec))
{
    Rfc4180Writer.WriteDataTable(rawData, writer, false);
}
var msbl = new MySqlBulkLoader(conn);
msbl.TableName = "testtable";
msbl.FileName = tempCsvFileSpec;
msbl.FieldTerminator = ",";
msbl.FieldQuotationCharacter = '"';
msbl.Load();
System.IO.File.Delete(tempCsvFileSpec);

…包括以下时间:将DataTable中的100,000行转储到临时CSV文件中(使用与此类似的代码),从该文件中批量加载,然后再删除该文件。

2020-05-17