我有一个如下数据库表:
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条记录。)
答案 0 :(得分:6)
您可以使用bulk insert
的概念,同时执行多次插入,最大限度地减少多次调用ExecuteNonQuery
的开销。
这称为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选项。有些选项取决于表格类型(InnoDB与MyISAM)。
一般建议:始终指定在VALUES
前面插入的列。这使得代码更易于维护。
答案 2 :(得分:1)
您应该进行批量插入。 ADO.NET的方法是使用DataAdapter。
对于MySQL特定的解决方案,请使用MySqlBulkLoader。
答案 3 :(得分:0)
一般规则: -
大部分提示都在文档中解释。