8

2 つのテーブルがあり、一方は他方の主キーにリンクされています。現時点では、テーブル A に INSERT し、LAST_INSERT_ID を取得してから、テーブル B に 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複数のエントリをより速く追加するには - ただし、1 つのテーブルに対してのみです。

もちろん、後者の方がはるかに高速です。ストアド プロシージャを使用して 2 つのリンクされたテーブルを使用して、私の例でこの動作を再現できるかどうか、また同様にパフォーマンスが大幅に向上するかどうか疑問に思っていました。

次のようなもの: call special_insert((0, 1, 2), (4, 5, 6), etc); または類似。

私はストアド プロシージャの経験がないので、どの方向に進むべきかについてアイデアを探しています。

4

2 に答える 2

12

これは、Last_Insert_ID() を含む 2 つのテーブルの挿入を伴うストア プロシージャの例です。

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 ストアド プロシージャと複雑なクエリの比較

しかし、かなりの数のリンクされたレコードを 1 つに挿入する必要があったため、次のようにしました。

(x, y) 値 (1,2)、(3,4)、(5,6)、... (N-1, N) に挿入

ID = GET_LAST INSERT_ID

InnoDB テーブルを使用する限り、id の範囲は id から id+N までです。

複数のレコード INSERT ステートメントで使用される MySQL LAST_INSERT_ID()

複数のレコード INSERT ステートメントで使用される MySQL LAST_INSERT_ID()

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 に答える