Open3

MySQLにおけるBulk Insertについて

O.SO.S

例として扱うテーブルのDDL

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    password VARCHAR(100)
);

bulk insert

INSERT INTO users (id, name, email, password) VALUES
(1, 'Name1', 'email1@example.com', 'hoge'),
(2, 'Name2', 'email2@example.com', 'huga'),
(3, 'Name3', 'email3@example.com', 'hogehuga'),
-- 以下、20まで続ける
(20, 'Name20', 'email20@example.com', 'passw@rd');

bulk upsert

基本的には、bulk insertの時と挙動は同じ。
ON DUPLICATE KEY UPDATE構文では、PRIMARY KEYもしくはUNIQUEインデックスに重複する値が発生した場合に更新となる。

以下の例では、ON DUPLICATE KEY UPDATEの後にnameカラムとemailカラムを指定しているので、
PRIMARY KEYもしくはUNIQUEインデックスに重複する値が発生した場合にはこれらのカラムのみ更新される。(言い換えると、それ以外のカラムは更新されない。)

INSERT INTO users (id, name, email, password) VALUES
(1, 'Name1', 'email1@example.com', 'hoge'),
(2, 'Name2', 'email2@example.com', 'huga'),
(3, 'Name3', 'email3@example.com', 'hogehuga'),
-- 以下、20まで続ける
(20, 'Name20', 'email20@example.com', 'passw@rd')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email);
O.SO.S

気をつけるべきこと

データ量が膨大な時は気をつける

バルクインサートは通常、個々の挿入よりも高速だが、非常に大きなデータセットを扱う場合は、パフォーマンスやメモリ使用量に影響を与える可能性がある。
=> その場合は、1000件ずつ処理するなどの対策が必要。

トランザクションログに気をつける

バルクインサートは一つのトランザクションとして処理される。非常に大量のデータを扱う場合、トランザクションログが大きくなることがある。

デッドロックに気をつける?

そもそもデッドロックとはなんだ?
(行単位のロック?)

https://qiita.com/kshibata101/items/8807897cfe276fa2326f
https://ichirin2501.hatenablog.com/entry/2015/12/24/164916#f-58894256