问题是关于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
它自己呢?它真的会给我提高速度吗?
答案 0 :(得分:-1)
批量插入可以快速运行10次,一次运行一行。原因就是所有网络等开销。
另一种技术是从单个批处理的IODKU更改为两个语句 - 一个用于插入新行,一个用于执行更新。 (我不知道是否会更快地运行。)Here是在&#34;规范化&#34;的背景下讨论这两个步骤。
需要注意的另一件事是:如果涉及AUTO_INCREMENT
(不是提到的列之一),那么IODKU可以&#34;烧&#34;对于进行“更新”的情况的ID。也就是说,IODKU(以及INSERT IGNORE
和其他一些)获取可能所需的所有auto_inc,然后继续使用 所需的那些&浪费其他人。
你进入&#34;收益递减&#34;如果您尝试在批处理中插入超过几百行。你强调回滚日志。