繁体   English   中英

MySQL插入查询优化

[英]MySQL Insert Query Optimization

将大量行插入表中时,以下两种方法中的哪一种会更快。

查询方法一:一一执行查询。

INSERT INTO tbl_user(id, name, number) VALUES(NULL, 'A', '9999999999');
INSERT INTO tbl_user(id, name, number) VALUES(NULL, 'B', '9999999999');
INSERT INTO tbl_user(id, name, number) VALUES(NULL, 'C', '9999999999');

查询方法2:立即执行查询。

INSERT INTO tbl_user(id, name, number) VALUES(NULL, 'A', '9999999999'),
                                             (NULL, 'B', '9999999999'), 
                                             (NULL, 'C', '9999999999');

由于有一些争论,我想我会尝试一个基准,但首先

 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 行; 三个执行的平均(平均)运行时间 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 TRANSACTIONCOMMIT

1000 行 3 次执行的平均(平均)运行时间 0.16 秒
5000 行 3 次执行的平均(平均)运行时间 0.48
10000 行 3 次执行的平均(平均)运行时间 0.91

结论:
方案 2,即其他两个答案中提出的方案,确实在很大程度上优于方案 1。 有了这些数据,很难在 2 和 3 之间做出选择。 需要使用大量插入件进行更严格的测试。 但是如果没有这些信息,我可能会选择三个,原因是解析一个非常大的字符串通常会有开销,准备一个也是如此! 我怀疑如果我们尝试在单个语句中一次插入大约 50,000 条记录,它实际上可能会慢很多。

第二种方法(查询)比第一种方法快。

因为在第一种方法中它在表上执行三个不同的查询,而在第二种方法中它只执行一次以在表中插入多条记录。

当您一次插入数百行时,您会看到重大差异。

第二个查询比第一个查询快得多。 根据文档,有助于提高单个语句中多个插入的性能的因素是:-

9.2.2.1 INSERT 语句的速度

要优化插入速度,请将许多小操作合并为一个大操作。 理想情况下,您建立一个连接,一次发送许多新行的数据,并将所有索引更新和一致性检查延迟到最后。

插入一行所需的时间由以下因素决定,其中数字表示大致比例:

连接: (3)

向服务器发送查询:(2)

解析查询:(2)

插入行:(1 × 行大小)

插入索引:(1 × 索引数)

闭幕式:(1)

如果您同时从同一客户端插入多行,请使用带有多个 VALUES 列表的 INSERT 语句一次插入多行。 这比使用单独的单行 INSERT 语句快得多(在某些情况下快很多倍)。 如果要将数据添加到非空表,则可以调整 bulk_insert_buffer_size 变量以加快数据插入速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM