8

我有两张表,一张链接到另一张的主键。在我插入表 A 的那一刻,获取 LAST_INSERT_ID,然后插入表 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), etc); 或类似的。

我没有存储过程的经验,所以我正在寻找有关前进方向的想法。

4

2 回答 2

12

下面是一个包含 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);
于 2012-04-09T16:43:04.987 回答
2

经过一些进一步的调查,似乎 SP 不会提供显着的速度改进,并且不能接受像 INSERT INTO 这样的批量参数

MySQL 存储过程与复杂查询

但是我仍然需要在一个中插入相当多的链接记录,所以我做了以下操作:

插入 (x, y) 值 (1,2), (3,4), (5,6), ... (N-1, N)

id = GET_LAST INSERT_ID

只要我们使用 InnoDB 表,id 的范围从 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从复制增量增量。

于 2012-04-11T14:00:05.493 回答