使用Mysql对链表进行多次INSERT

Mic*_*nze 6 mysql stored-procedures insert last-insert-id

我有两个表,一个链接到另一个的主键.目前我插入表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); 
Run Code Online (Sandbox Code Playgroud)

等等,或

INSERT INTO table_a (v1, v2, v3) VALUE (0, 1, 2), (4, 5, 6), etc 更快地添加多个条目 - 但仅适用于一个表.

当然后者要快得多.我想知道是否可以使用存储过程为两个链接表复制此行为,以及它是否会在性能上有类似的显着改进:

类似于:调用special_insert((0,1,2),(4,5,6)等); 或类似的.

我没有存储过程经验,所以我正在寻找继续前进的方向.

eab*_*ham 9

下面是一个存储过程的示例,其中包含两个表插入,包括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);
Run Code Online (Sandbox Code Playgroud)


Mic*_*nze 2

经过进一步调查后,似乎 SP 不会提供显着的速度改进,并且无法接受批量参数,例如 INSERT INTO

MySQL 存储过程与复杂查询

但我仍然需要在其中插入相当大量的链接记录,因此我执行了以下操作:

插入 (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() 与多记录 INSERT 语句一起使用

MySQL LAST_INSERT_ID() 与多记录 INSERT 语句一起使用

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复制增量。