我正在运行 ETL 流程并将数据流式传输到 MySQL 表中。
现在它是通过网络连接(相当快的连接)写入的——因此这可能成为瓶颈。
无论如何,这是一个基本的插入/更新功能。它是一个作为主键/索引的 ID 列表......然后是一些属性。
如果找到新的 ID,则插入,否则更新...您明白了。
当前基于 ID(索引)执行“更新,否则插入”功能需要 13 行/秒(这看起来非常糟糕,对吧?)。这是将 1000 行与包含 25 万条记录的数据库进行比较,以了解上下文。
当执行“纯”插入所有内容方法时,作为比较,已经将过程加速到 26 行/秒。
纯“插入”方法的问题是,我可以一次“插入”20 个并行连接...(网络主机允许的最大数量是 20 个)...而任何“更新”函数都不能有任何并行连接正在运行。
因此 26 x 20 = 520 r/s。远大于 13 r/s,特别是如果我可以配置一些东西,允许并行推送更多数据。
我的问题是...考虑到插入与更新的巨大好处,有没有办法复制“更新”功能(我只希望给定 ID 的最新插入保留下来)....进行大量插入,然后运行删除函数,删除不是“最新”的重复 ID?
这是容易实现的东西,还是经常出现的东西?
我还能做些什么来确保更新过程更快?我知道摆脱 ETL 工具和数据库之间的“Web 连接”是一个开始,但还有什么呢?这似乎是一个相当普遍的问题。
最终有 20 列,最多可能是 varchar(50) ...我是否应该每秒处理超过 13 行?
最佳答案
您的问题有很多可能的“答案”。
13/秒——可以做很多事情......
INSERT ... ON DUPLICATE KEY UPDATE ...
('IODKU') 通常是执行“更新,否则插入”的最佳方法(除非我不知道你的意思它)。
批量插入比一次插入一行要快得多。最佳值是 100 行左右,可提供 10 倍的加速。 IODKU(通常)也可以批量处理;请参阅 VALUES()
伪函数。
BEGIN;
...大量写入...COMMIT;
显着减少事务开销。
使用“临时”表来收集更新内容可以带来显着的好处。 My blog discussing that.这还涵盖批量“标准化”。
动态构建汇总表会干扰高速数据摄取。 Another blog covers Summary tables .
标准化可用于重复数据删除,从而缩小磁盘占用空间。这对于减少数据仓库中“事实”表的 I/O 非常重要。 (我指的是您的 20 x VARCHAR(50)
。)
RAID strip 化是一种硬件帮助。
RAID Controller 上的电池支持写入缓存使写入看起来像是瞬时的。
SSD 加速 I/O。
如果您提供一些更具体的信息(SHOW CREATE TABLE
、SQL 等),我可以更具体。
关于mysql - 提高 SQL 'Update' 函数的速度 - 插入/删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29975802/