我使用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亿行而没有明显的性能下降。