我刚刚创建了一个新的分区表来替换旧的非分区表(重命名为保管)。我在创建它时将旧表中的最新数据复制到新表中,但我仍然有大约一半的数据需要复制。问题是,这是一个实时的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以尽可能低的优先级执行此操作,并且只在其(相对)空闲时间内处理该任务?
答案 0 :(得分:1)
除了减少一次插入的行数外,尝试将bulk_insert_buffer_size
系统变量的值增加到更适合您的情况的值?默认值为8MB。