提高SQL“更新”功能的速度 - 进入插入/删除?

时间:2015-04-30 19:08:40

标签: mysql database performance optimization insert-update

我正在运行ETL过程并将数据流式传输到MySQL表中。

现在它是通过网络连接(相当快的一个)写的 - 所以这可能是一个瓶颈。

无论如何,它是一个基本的插入/更新功能。它是一个ID列表作为主键/索引....然后是一些属性。

如果找到新的ID,请插入,否则,更新......您明白了。

目前正在进行基于ID(索引)的“更新,否则插入”功能需要13行/秒(这看起来非常糟糕,对吧?)。对于上下文,这是将1000行与250k记录的数据库进行比较。

在进行“纯”插入操作时,为了进行比较,所有方法都已将进程加速到26行/秒。

纯粹的“插入”方法的事情是我可以同时“插入”20个并行连接...(网络主机允许最多20个)...而任何“更新”功能都不能有任何相似之处运行

因此26 x 20 = 520 r / s。相当于13 r / s,特别是如果我可以装备一些东西,允许更多的数据并行通过。

我的问题是......考虑到插入与更新的巨大好处,有没有办法复制'更新'功能(我只希望最新的给定ID插入存活)....做一个大量的插入,然后在事后运行删除函数,删除不是“最新”的重复ID?

这是一件容易实现的东西,还是经常出现的东西?

我还能做些什么来确保此更新过程更快?我知道摆脱ETL工具和DB之间的“网络连接”是一个开始,但还有什么?这似乎是一个相当普遍的问题。

最终有20列,最大可能是varchar(50)...我应该获得超过13行处理/秒?

1 个答案:

答案 0 :(得分:1)

在DBMS中执行此操作,并将其包装在事务中。

解释:

  1. 以最快的方式将数据加载到MySQL中的临时表中。批量加载,插入,做任何工作。查看“加载数据infile”。

  2. 将临时表外连接到目标表,然后INSERT那些目标表的PK列为NULL的行。

  3. 将临时表外连接到目标表,并更新目标表的PK列为NOT NULL的那些行。

  4. 在一个事务的开始/提交(或[启动事务] /提交对中包装步骤2和3。默认行为可能是自动提交,这意味着每次插入/更新后你都会做大量的数据库工作。正确使用交易,每个区块只做一次工作。