2016-09-24 141 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有什麼作用嗎? –