0

问题是关于数据库的SQL遗留代码MySQL

众所周知,在执行INSERT ... ON DUPLICATE KEY UPDATE语句时,VALUES(col_name)函数可用于从 INSERT 部分引用列值,而不是在那里传递确切的值:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c)

我的遗留代码包含许多参数化样式的巨大插入(它们用于批量插入):

INSERT INTO table (a,b,c, <...dozens of params...>) VALUES (?,?,?,<...dozens of values...>)
  ON DUPLICATE KEY UPDATE b=?, c=?, <...dozens of params...>

问题是:如果我将所有这些查询更改为使用VALUES(col_name)函数(UPDATE部分),它会提高批量插入的性能吗?

jdbc我的查询是使用驱动程序从 java 代码执行的。所以,我猜,对于长文本值,它应该显着减少查询的大小。MySQL自己呢?一般来说,它真的会让我提高速度吗?

4

1 回答 1

-1

批量插入可以以 10 倍的速度运行,一次运行一行。其原因是所有网络等开销。

另一种技术是将单个批处理 IODKU 更改为两条语句——一条用于插入新行,一条用于更新。(我不知道这是否会运行得更快。) 是在“规范化”的背景下对这两个步骤的讨论。

另一件需要注意的事情:如果AUTO_INCREMENT涉及(不是提到的列之一),那么 IODKU 可能会在它进行“更新”的情况下“烧录”ID。也就是说,IODKU(和INSERT IGNORE其他一些)获取它可能需要的所有 auto_incs,然后继续使用它确实需要的那些并浪费其他的。

如果您尝试在一个批次中插入超过几百行,您将陷入“收益递减”。你强调回滚日志。

于 2016-06-09T02:22:58.170 回答