如何尽快将2000万条记录插入MySql数据库

时间:2011-12-12 13:16:25

标签: .net mysql connector-net

我有一个如下数据库表:

create table temperature
(id int unsigned not null auto_increment primary key,
temperature double
);

在我的程序中,我有大约2000万的温度插入表中。 我在.Net环境中工作,使用Connector / Net连接到MySql。代码如下:

List<double> temps = new List<double>();
...
string connStr = "server=localhost;user=name;database=test;port=3306;password=*****;";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
    conn.Open();

    //temps.Count is about 20 million
    for (int i = 0; i < temps.Count; i++)
    {
        string sql1 = "INSERT INTO temperature VALUES (null, "+temps[i]+")";
        MySqlCommand cmd1 = new MySqlCommand(sql1, conn);
        cmd1.ExecuteNonQuery();
    }

}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}
conn.Close();

如何尽可能快地插入这么多行数据? (它每分钟只能在我的电脑中插入2000条记录。)

4 个答案:

答案 0 :(得分:6)

您可以使用bulk insert的概念,同时执行多次插入,最大限度地减少多次调用ExecuteNonQuery的开销。

在MySQL中

这称为LOAD DATA,请点击此处查看详细信息:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

在MS SQL Server中,这被称为bulk insert,这就是众所周知的,这就是我用这个名字提到它的原因。

答案 1 :(得分:5)

有许多方法可以优化批量插入。有些是:

  • LOAD DATA INFILE。有一个wrapper API for .NET。这是最快的方法,但与简单插入有一些限制和语义差异。

  • 多行INSERT语句:

    INSERT INTO temperature (temperature) VALUES (1.0), (2.0), (3.0), ...

    您不应该一次插入20.000.000行,但可能需要尝试1.000-10.000以获得非常大的加速。这是一种简单且非常有问题的提高速度的方法。通常可能有10倍,有时甚至更多。

  • 锁定表格(LOCK TABLES)。

  • 暂时禁用索引。

  • MySQL选项调整。

  • INSERT DELAYED(这里很可能不那么有用)。

文档确实为您提供了more elaborate detail选项。有些选项取决于表格类型(InnoDBMyISAM)。

一般建议:始终指定在VALUES前面插入的列。这使得代码更易于维护。

答案 2 :(得分:1)

您应该进行批量插入。 ADO.NET的方法是使用DataAdapter

对于MySQL特定的解决方案,请使用MySqlBulkLoader

答案 3 :(得分:0)

一般规则: -

  1. use load data infile
  2. 导入期间禁用密钥,在导入所有数据后将其启用
  3. 在数据库服务器本身运行脚本,使用socket而不是tcp / ip连接
  4. 大部分提示都在文档中解释。