2016-09-24 142 views
2

以下两种方法中的哪一种将更快地将大量行插入到表中。MySQL插入查询优化

查询方法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'); 
+0

方法2,因为它只执行一次。 – Dave

+0

方法2比第一个更快 –

+0

我们在这里显示了有多少人不知道发生了什么。你**希望**一一执行。你永远不想做选项2。为什么?因为如果将第一个方法包装在事务块中并使用预准备语句 - 您将永远不会因为max_packet_size而遇到错误。选项编号2也是需要更多资源来解析。你总是想避免这种情况,如果发生任何不良情况,调试也很难。因此 - 选项#3是最快的。在开始处添加'BEGIN TRANSACTION'并在末尾添加'COMMIT'。祝你好运。 –

回答

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号线蟒蛇的问题形式的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周围的INSERT语句

1000行平均(平均)包执行三次运行时间0.16秒类似
5000行平均(平均)运行时间执行三次0.48
10000行平均(平均值)运行执行三次0.91

结论:
方案2,这是什么在T建议其他答案的确大大超过了方案1。有了这些数据,虽然很难在2和3之间选择。需要更大量的插件进行更严格的测试。

+0

恰当的例子给出了完美的答案。 –

+0

很高兴得到了帮助 – e4c5

0

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

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

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

0

第二个查询比第一个查询快得多。按照document因素有助于增加多个插件的性能在一条语句是: -

9.2.2.1 INSERT语句的速度

为了优化插入速度,并结合大量的小规模经营成一个单一的 大操作。理想情况下,您建立一个连接,同时发送数据 以获得许多新行,并延迟所有索引更新和一致性检查,直到最后。

用于插入一排由以下 因子,其中的数字表示大致的比例来确定所需要的时间:

连接:(3)

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

解析查询:(2)

插入行:(1×尺寸行的)

Insertin摹指标:(1×号索引)

闭幕:(1)

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

+0

方法#2根本不会更快。你只提供一半的信息。如果有的话,它会变慢。您引用的文档有一个有趣的观点 - “优化插入速度,将许多小操作合并为一个大操作” - 我们通过使用事务来完成此操作,而不是通过发送大量文本来解析MySQL。我不会就你的答案投票,但这完全是误导。 –

+0

这是优化的一般事情。在我的回答中阅读下面添加的细分,而不是引用。这再次来自我添加的同一个文档,“如果你同时插入来自同一个客户端的多行,使用带有多个VALUES列表的INSERT语句一次插入多行,这是相当快的某些情况下)比使用单独的单行INSERT语句“ – Naruto

+0

因此,您认为发送MySQL必须解析的512mb字符串比发送要插入的值更快,而且要封装在事务中?你知道交易对HDD I/O有什么作用吗? –