UPDATE子句

时间:2016-06-03 08:24:47

标签: mysql sql performance jdbc batch-insert

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

众所周知,在执行INSERT ... ON DUPLICATE KEY UPDATE语句VALUES(col_name)函数can be used时,要从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它自己呢?它真的会给我提高速度吗?

1 个答案:

答案 0 :(得分:-1)

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

另一种技术是从单个批处理的IODKU更改为两个语句 - 一个用于插入新行,一个用于执行更新。 (我不知道是否会更快地运行。)Here是在&#34;规范化&#34;的背景​​下讨论这两个步骤。

需要注意的另一件事是:如果涉及AUTO_INCREMENT(不是提到的列之一),那么IODKU可以&#34;烧&#34;对于进行“更新”的情况的ID。也就是说,IODKU(以及INSERT IGNORE和其他一些)获取可能所需的所有auto_inc,然后继续使用 所需的那些&浪费其他人。

你进入&#34;收益递减&#34;如果您尝试在批处理中插入超过几百行。你强调回滚日志。