不确定 MySQL,但我发现到目前为止,使用 sql server 插入的最快方法类似于@Rahautos,但将值列表分隔到单独的查询中。
我知道这听起来很奇怪,但这将速度提高了 10 倍,从每秒 1200 次插入到 12000 次插入。
不知道有什么区别。
这笔交易也有很大帮助。
INSERT INTO tbl_name
(a,b,c)
VALUES
(1,2,3);
INSERT INTO tbl_name
(a,b,c);
VALUES
(4,5,6);
INSERT INTO tbl_name
(a,b,c);
VALUES
(7,8,9);
示例代码
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var constring = (new SqlConnectionStringBuilder
{
DataSource = "someserver",
InitialCatalog = "12trunk",
IntegratedSecurity = true
}).ToString();
using (var con = new SqlConnection(constring))
{
con.Open();
using (var trans = con.BeginTransaction(isolationLevel: System.Data.IsolationLevel.ReadUncommitted) as SqlTransaction)
using (var cmd = new SqlCommand())
{
cmd.Transaction = trans;
cmd.Connection = con;
var start = DateTime.Now;
Console.WriteLine("Start = " + start);
const int inserts = 100000;
var builder = new StringBuilder();
cmd.CommandText = "delete from test";
for (int i = 0; i < inserts; i++)
{
Guid[] guids = new Guid[7];
for (int j = 0; j < 7; j++)
{
guids[j] = Guid.NewGuid();
}
var sql = $"insert into test (f0, f1, f2, f3, f4, f5, f6) values ('{guids[0]}', '{guids[1]}', '{guids[2]}','{guids[3]}', '{guids[4]}', '{guids[5]}', '{guids[6]}');\n";
builder.Append(sql);
if (i % 1000 == 0)
{
cmd.CommandText = builder.ToString();
cmd.ExecuteNonQuery();
builder.Clear();
}
}
cmd.CommandText = builder.ToString();
cmd.ExecuteNonQuery();
trans.Commit();
var ms = (DateTime.Now - start).TotalMilliseconds;
Console.WriteLine("Ms to run = " + ms);
Console.WriteLine("inserts per sec = " + inserts / (ms / 1000));
Console.ReadKey();
}
}
}
}
}