簡體   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