Insert ..在每次插入后选择提交到InnoDB表吗?

时间:2011-05-05 23:46:30

标签: mysql sql transactions insert innodb

我刚刚创建了一个新的分区表来替换旧的非分区表(重命名为保管)。我在创建它时将旧表中的最新数据复制到新表中,但我仍然有大约一半的数据需要复制。问题是,这是一个实时的Web服务不受限制,每当我尝试通过INSERT..SELECT复制一个块时,它坚持将其作为一个原子事务(它消耗所有服务器的资源,减慢所有内容)爬行,并可能危险地推动服务器接近物理资源的耗尽。)

请注意:OldTable是MyISAM。 NewTable是InnoDB,在主键'a'上按范围划分。两个表都具有相同的字段名称。字段本身并不相同,但在它们不同的地方,NewTable中的字段更大。

导致问题的查询如下:

INSERT INTO NewTable (a,b,c,d,e,f,g) 
SELECT a,b,c,d,e,f,g 
FROM OldTable 
WHERE a > 300000000 AND a <= 400000000
order by a

我想要它做什么:要么在每次插入后提交,要么完全放弃事务完整性,并允许脏读取发生。

锁定NewTable(可能超出插入的单行)是不可接受的。锁定OldTable很好,因为没有别的东西正在使用它,无论如何(当然,除了SQL将它复制到新表中)。

此外,有没有办法告诉MySQL以尽可能低的优先级执行此操作,并且只在其(相对)空闲时间内处理该任务?

1 个答案:

答案 0 :(得分:1)

除了减少一次插入的行数外,尝试将bulk_insert_buffer_size系统变量的值增加到更适合您的情况的值?默认值为8MB。