由于存在一些争论,我想我应该尝试一个基准测试,但首先
CREATE TABLE `tbl_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`number` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
然后,我使用 2 行 python 生成问题中形式的 SQL 查询。
场景一:
许多单个插入,每个查询都完全相同
INSERT INTO tbl_user VALUES(NULL,'A','9999999');
INSERT INTO tbl_user VALUES(NULL,'A','9999999');
1000 行;三次执行的平均(mean)运行时间 45.80 秒
5000 行;单次运行220秒
场景2:
单个查询插入 1000 行,如下所示:
INSERT INTO tbl_user VALUES(NULL,'A','9999999'),
(NULL,'A','9999999'),
(NULL,'A','9999999'),
(NULL,'A','9999999'),
1000 行 3 次执行的平均运行时间 0.17 秒
5000 行 3 次执行的平均运行时间 0.48
10000 行 3 次执行的平均运行时间 1.06
场景3:
与场景 1 类似,但有一个START TRANSACTION
and COMMIT
包裹在插入语句中
1000 行 3 次执行的平均运行时间 0.16 秒
5000 行 3 次执行的平均运行时间 0.48
10000 行 3 次执行的平均运行时间 0.91
结论:
场景 2,即其他两个答案中提出的内容,确实在很大程度上优于场景 1。有了这些数据,很难在 2 和 3 之间做出选择。需要对更多插入件进行更严格的测试。但如果没有这些信息,我可能会选择三个,原因是解析一个非常大的字符串通常会产生开销,准备一个字符串也是如此!我怀疑如果我们尝试在一条语句中一次插入大约 50,000 条记录,实际上可能会慢很多。