場景:表 a(1000萬+)、表 b(1000萬+) 需關聯合併寫入表 c。直接 SELECT JOIN 後應用層組裝會導致內存溢出、耗時過長。
-- 表 a
CREATE TABLE a (id INT PRIMARY KEY, a INT, b INT, c INT);
-- 表 b
CREATE TABLE b (aID INT, d INT, e INT, f INT); -- aID 關聯 a.id
-- 目標表 c
CREATE TABLE c (
aID INT PRIMARY KEY,
a INT, b INT, c INT, d INT, e INT, f INT
);
INSERT INTO c (aID, a, b, c)
SELECT id, a, b, c FROM a
ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b), c=VALUES(c);
INSERT INTO c (aID, d, e, f)
SELECT aID, d, e, f FROM b
ON DUPLICATE KEY UPDATE d=VALUES(d), e=VALUES(e), f=VALUES(f);
LIMIT 分片執行,控制事務大小ON DUPLICATE KEY UPDATE 保證重複運行不產生髒數據-- 每次處理 10 萬行
INSERT INTO c (aID, a, b, c)
SELECT id, a, b, c FROM a
WHERE id > @last_id ORDER BY id LIMIT 100000
ON DUPLICATE KEY UPDATE a=VALUES(a), b=VALUES(b), c=VALUES(c);
應用層循環執行直到影響行數為 0。
aID)