我有一个如下所示的数据库表:
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条记录。)
有多种方法可以优化批量插入。有些是:
LOAD DATA INFILE
。有一个.NET 的包装 API http://dev.mysql.com/doc/refman/5.6/en/connector-net-programming-bulk-loader.html。这是最快的方法,但与简单插入有一些限制和语义差异。
-
多排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
(在这里很可能没那么有用)。
该文档确实给了你更详细的细节 http://dev.mysql.com/doc/refman/5.6/en/insert-speed.html关于选项。一些选项取决于表类型(InnoDB http://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html vs. MyISAM http://dev.mysql.com/doc/refman/5.6/en/optimizing-myisam-bulk-data-loading.html).
一般建议:始终指定在前面插入的列VALUES
。这使得代码更易于维护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)