如果我运行了很长时间的更新(有数百万条记录需要更新,并且需要几个小时),我想知道是否还有杀死更新没有让InnoDB回滚变化。
我希望已经更新的记录保持原样(并且表锁定尽快发布),这意味着稍后我有时间继续更新。
这类似于MyISAM杀死更新时的行为。
答案 0 :(得分:1)
如果你的意思是单UPDATE
,我可能错了,但我怀疑这是可能的。但是,您始终可以将查询拆分为较小的集合。而不是:
UPDATE foo SET bar=gee
...使用:
UPDATE foo SET bar=gee WHERE id BETWEEN 1 AND 100;
UPDATE foo SET bar=gee WHERE id BETWEEN 101 AND 200;
UPDATE foo SET bar=gee WHERE id BETWEEN 201 AND 300;
...
这可以通过多种方式实现自动化。
答案 1 :(得分:0)
我的建议是创建一个black_hole表,其中包含符合更新语句需求的字段。
CREATE TABLE bh_table1
..field defs
) ENGINE = BLACKHOLE;
现在在黑洞桌上创建一个触发器。
DELIMITER $$
CREATE TRIGGER ai_bh_table1_each AFTER INSERT ON bh_table1 FOR EACH ROW
BEGIN
//implicit start transaction happens here.
UPDATE table1 t1 SET t1.field1 = NEW.field1 WHERE t1.id = NEW.id;
//implicit commit happens here.
END $$
DELIMITER ;
您可以将更新语句作为插入黑洞的插入。
INSERT INTO bh_table1 (id, field1)
SELECT id, field1
FROM same_table_with_lots_of_rows
WHERE filter_that_still_leaves_lots_of_rows;
这仍然比您的初始更新慢很多 让我知道结果如何。