我有两个表,一个链接到另一个的主键。目前我插入表A,获取LAST_INSERT_ID,然后INSERT到表B中。
但我要插入数百条记录,我想加快速度。
在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
可以更快地添加多个条目 - 但仅限于一个表。
当然后者要快得多。我想知道是否有可能使用存储过程为两个链接表复制此行为,以及它是否会在性能上有类似的显着改进:
类似于:调用special_insert((0,1,2),(4,5,6)等);或类似的。
我没有存储过程的经验,因此我会在哪个方向继续学习。
答案 0 :(得分:8)
以下是包含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', 'me@somewhere.com', 1);
答案 1 :(得分:1)
经过一些进一步调查后,似乎SP不会提供显着的速度提升,也无法接受INSERT INTO等批量参数
MySQL Stored Procedure vs. complex query
但是我仍然需要在一个中插入相当多的链接记录,所以我做了以下内容:
插入(x,y)值(1,2),(3,4),(5,6),...(N-1,N)
id = GET_LAST INSERT_ID
只要我们使用InnoDB表,ids的范围从id到id + N:
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增量增量。