gpt4 book ai didi

mysql - Insert..Select into InnoDB table with commit after every insert?

转载 作者:行者123 更新时间:2023-11-29 00:56:26 25 4
gpt4 key购买 nike

我刚刚创建了一个新的分区表来替换旧的非分区表(为了安全起见而重命名)。我在创建新表时将旧表中的最新数据复制到新表中,但我仍然有大约一半的数据需要复制。问题是,它是一个实时网络服务,不断受到攻击,每次我尝试通过 INSERT..SELECT 复制一个 block 时,它坚持将其作为原子事务进行(它消耗所有服务器的资源,将一切减慢到爬行,并可能使服务器危险地接近耗尽物理资源)。

需要说明的是: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(可能超出插入的一行)是 Not Acceptable 。锁定 OldTable 没问题,因为无论如何都不再使用它(当然,除了将它复制到新表的 SQL 之外)。

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

最佳答案

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

关于mysql - Insert..Select into InnoDB table with commit after every insert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5905331/

25 4 0