2012-04-09 30 views
5

我有兩個表,一個鏈接到另一個的主鍵。此刻我插入到表A中,獲取LAST_INSERT_ID,然後插入到表B中。使用Mysql在鏈接的表上執行多個INSERT

但是我有數百條記錄要插入,我想加快速度。

在MySQL中,您可以:

INSERT INTO table_a (v1, v2, c3) VALUE (0, 1, 2); 

INSERT INTO table_a (v1, v2, v3) VALUE (4, 5, 6); 

等,或

INSERT INTO table_a (v1, v2, v3) VALUE (0, 1, 2), (4, 5, 6), etc多個條目添加更快 - 但只有一個表。

當然後者要快得多。我想知道是否可以使用存儲過程對兩個鏈接表複製此行爲,以及它是否會在性能上有類似戲劇性的改進:

類似於:call special_insert((0,1, 2),(4,5,6)等);或類似的。

我沒有存儲過程的經驗,所以我在釣魚的想法在其上進行方向。

+0

該SP會讓你模擬一個多表單片插入。問題是......如何將參數列表中的表A數據與表B數據分開。 – 2012-04-09 15:23:17

+0

好吧,通過編寫我自己的存儲過程,我會知道參數列表中的數據意味着什麼...... SP是否會比單獨的INSERTS快得多? – 2012-04-09 15:32:19

+1

我不太瞭解。你必須對兩種方法進行基準測試,但最終你仍然會做兩次插入,並且無法解決這個問題。 – 2012-04-09 15:45:15

回答

1

經過進一步的調查卻顯示爲SP不會提供顯著的速度提升,並且不能接受批量參數,如INSERT INTO

MySQL Stored Procedure vs. complex query

但我仍然需要插入一個相當大的數量的(1,2),(3,4),(5,6),...(N-1,N)中插入一個(x,y)值(012), )

ID = GET_LAST INSERT_ID

ID的範圍是從ID爲ID + N只要我們使用InnoDB表:

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

MySQL LAST_INSERT_ID() used with multiple records INSERT statement

http://gtowey.blogspot.com/2012/02/multi-insert-and-lastinsertid.html

然後

INSERT INTO b(a_id,z)VALUES(id,2),(id + 1,4), (id + 2,6),...(id + N,11) 只有你需要從複製中知道你的mysql增量增量。

7

下面是一個存儲過程的例子有兩個表插入包括LAST_INSERT_ID()。

DELIMITER // 
CREATE PROCEDURE new_person(
    first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT) 
BEGIN 
START TRANSACTION; 
    INSERT INTO person(firstname, lastname, email) 
    VALUES(first, last, email); 

    INSERT INTO tasks (engineer_id, tool_id) 
    VALUES(LAST_INSERT_ID(), tool_id); 
COMMIT; 
END// 
DELIMITER ; 

CALL new_person('Jerry', 'Fernholz', '[email protected]', 1); 
+0

這是一個非常簡潔的SP示例,謝謝,我明白這一點。是否有可能傳遞一個數組,例如:CALL new_person(('Jerry','Fernholz','[email protected]',1),('Bob','Smith','[email protected] ',2),('Sally','Wood','me @ s.com',2),('Will','Black','[email protected]',3)); ? – 2012-04-09 17:15:49

+0

不,無論您使用哪種語言,都應在每次遍歷數組時調用SP。 – eabraham 2012-04-09 17:50:03

相關問題