MySQL中的Sqlalchemy批量更新工作非常缓慢

MySQL中的Sqlalchemy批量更新工作非常缓慢,第1张

MySQL中的Sqlalchemy批量更新工作非常缓慢

即使数据库服务器(如您的情况)的延迟非常糟糕,您也可以使用技巧来加快批量更新 *** 作的速度。不用直接更新表,而是使用 阶段表 非常快速地插入新数据,然后对
目标表 进行一次join-update 。这还有一个优点,您可以大大减少必须发送到数据库的语句数量。

UPDATE如何工作?

假设您有一个表,

entries
并且一直有新数据出现,但是您只想更新已存储的数据。您创建目标表的副本,
entries_stage
其中仅包含相关字段:

entries = Table('entries', metadata,    Column('id', Integer, autoincrement=True, primary_key=True),    Column('value', Unipre(64), nullable=False),)entries_stage = Table('entries_stage', metadata,    Column('id', Integer, autoincrement=False, unique=True),    Column('value', Unipre(64), nullable=False),)

然后,使用大容量插入插入数据。如果您使用MySQL的多值插入语法,这可以进一步加快速度,SQLAlchemy本身不支持这种语法,但是构建起来并不难。

INSERT INTO enries_stage (`id`, `value`)VALUES(1, 'string1'), (2, 'string2'), (3, 'string3'), ...;

最后,使用阶段表中的值更新目标表的值,如下所示:

 UPDATE entries e JOIN entries_stage es ON e.id = es.id SET e.value = es.value;

这样就完成了。

插件呢?

当然,这也可以加快插入速度。由于您已经在 stage-table中 包含了数据,因此您所要做的就是发出一条

INSERT INTO ...SELECT
语句,使用尚未在 Destination-table中 的数据。

INSERT INTO entries (id, value)SELECT FROM entries_stage esLEFT JOIN entries e ON e.id = es.idHAVINg e.id IS NULL;

关于这样做的好处是,你没有做

INSERT IGNORE
REPLACE
或者
ON DUPLICATE KEY UPDATE
,它
会增加你的主键,即使他们会做什么



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5617668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存