Open3
MySQLにおけるBulk Insertについて
参考
例として扱うテーブルの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);
気をつけるべきこと
データ量が膨大な時は気をつける
バルクインサートは通常、個々の挿入よりも高速だが、非常に大きなデータセットを扱う場合は、パフォーマンスやメモリ使用量に影響を与える可能性がある。
=> その場合は、1000件ずつ処理するなどの対策が必要。
トランザクションログに気をつける
バルクインサートは一つのトランザクションとして処理される。非常に大量のデータを扱う場合、トランザクションログが大きくなることがある。
デッドロックに気をつける?
そもそもデッドロックとはなんだ?
(行単位のロック?)