InnoDB:任何杀死更新和防止回滚的方法?

时间:2011-08-29 15:25:33

标签: mysql innodb kill

如果我运行了很长时间的更新(有数百万条记录需要更新,并且需要几个小时),我想知道是否还有杀死更新没有让InnoDB回滚变化。

我希望已经更新的记录保持原样(并且表锁定尽快发布),这意味着稍后我有时间继续更新。

这类似于MyISAM杀死更新时的行为。

2 个答案:

答案 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;

这仍然比您的初始更新慢很多 让我知道结果如何。