MySQL插入查询优化

时间:2016-09-24 10:22:52

标签: php mysql database performance

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

查询方法1:逐个执行查询。

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');

3 个答案:

答案 0 :(得分:2)

由于存在一些争论,我认为我会尝试基准测试,但首先是

 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查询。

情景1:
许多单个插入的查询都是完全相同的

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行三次执行的平均(平均)运行时间0.17秒 5000行三次执行的平均(平均)运行时间0.48
10000行三次执行的平均(平均)运行时间1.06

情景3:
与方案1类似,但插入语句包含START TRANSACTIONCOMMIT

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

<强>结论:
场景2,这是在其他两个答案中提出的确实在很大程度上优于场景1。有了这些数据,很难在2和3之间进行选择。需要使用更多数量的刀片进行更严格的测试。

答案 1 :(得分:0)

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

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

当您一次插入数百行时,您将看到主要区别。

答案 2 :(得分:0)

第二次查询比第一次快得多。根据{{​​3}}因素,在单个语句中有助于提高多个插入的性能: -

  

9.2.2.1 INSERT语句的速度

     

要优化插入速度,请将许多小型操作合并为一个   大手术。理想情况下,您进行单个连接,发送数据   对于许多新行,同时延迟所有索引更新和一致性   检查直到最后。

     

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

     

连接:(3)

     

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

     

解析查询:(2)

     

插入行:(1×行的大小)

     

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

     

结束:(1)

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