mysql - 提高 SQL 'Update' 函数的速度 - 插入/删除?

标签 mysql database performance optimization insert-update

我正在运行 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/

相关文章:

performance - 更快地计算两个位置之间的距离(邮政编码)

database - Mysql慢查询: JOIN + multiple WHERES + ORDER BY

mysql - ActiveRecord 查询日期之间并具有第一个属性值

java - 在 Eclipse 中运行 AlgoTrader 模拟

Mysql组合键顺序相关性

javascript - 压缩效率

performance - SimpleScalar 仿真中的 L1 和 L2 未命中率

mysql - 将所有记录保留在 "WHERE IN()"子句中,即使找不到

php - 子查询成为 Magento 中 Mysql 查询中的列

Python psycopg2 插入和更新现有 id 的冲突集数据并基于条件