2012-04-09 65 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