7

我有一个如下的数据库表:

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

在我的程序中,我将大约 2000 万个温度插入到表中。我在 .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

4 回答 4

8

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

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

  • 多行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(很可能在这里没那么有用)。

该文档确实为您提供了有关选项的更详细的详细信息。一些选项取决于表类型(InnoDBMyISAM)。

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

于 2013-02-15T10:20:43.247 回答
6

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

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

在 MS SQL Server 中,这被称为bulk insert并且它被称为,这就是为什么我用这个名字提到它。

于 2011-12-12T13:20:54.643 回答
2

你应该做批量插入。ADO.NET 的方法是使用DataAdapter

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

于 2011-12-12T13:28:32.297 回答
1

通用规则 :-

  1. 使用加载数据文件
  2. 在导入期间禁用密钥,在导入所有数据后重新启用它
  3. 在数据库服务器本身运行脚本,使用套接字而不是 tcp/ip 进行连接

大多数技巧在文档中都有解释。

于 2011-12-12T13:25:49.100 回答