【发布时间】:2015-04-30 19:08:40
【问题描述】:
我正在运行 ETL 进程并将数据流式传输到 MySQL 表中。
现在它是通过网络连接编写的(相当快的)——所以这可能是一个瓶颈。
无论如何,这是一个基本的插入/更新功能。它是一个作为主键/索引的 ID 列表......然后是一些属性。
如果找到新 ID,则插入,否则,更新……你明白了。
目前基于 ID(索引)执行“更新,否则插入”功能需要 13 行/秒(这看起来很糟糕,对吧?)。这是将 1000 行与 250k 记录的数据库进行比较,以获取上下文。
当做一个“纯”插入所有方法时,为了比较,已经将过程加速到 26 行/秒。
纯“插入”方法的问题是我可以一次“插入”20 个并行连接......(网络主机允许最多 20 个)......而任何“更新”功能都不能有任何并行正在运行。
因此 26 x 20 = 520 转/秒。远远大于 13 r/s,尤其是如果我可以安装一些东西,允许更多数据并行推送。
我的问题是......鉴于插入与更新的巨大好处,有没有办法复制“更新”功能(我只希望给定 ID 的最新插入能够存活)......通过进行大量插入,然后在事后运行删除函数,删除不是“最新”的重复 ID?
这是容易实现的东西,还是经常出现的东西?
我还能做些什么来确保这个更新过程更快?我知道摆脱 ETL 工具和 DB 之间的“网络连接”是一个开始,但还有什么?这似乎是一个相当普遍的问题。
最终有 20 列,最大可能是 varchar(50) ...我应该得到比 13 行多得多的处理/秒吗?
【问题讨论】:
-
您的“更新,否则插入”代码目前是什么样的?
标签: mysql database performance optimization insert-update