栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
,它
会增加你的主键,即使他们会做什么



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/611545.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号