您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

entries = Table('entries', Metadata,
    Column('id', Integer, autoincrement=True, primary_key=True),
    Column('value', Unicode(64), nullable=False),
)

entries_stage = Table('entries_stage', Metadata,
    Column('id', Integer, autoincrement=False, unique=True),
    Column('value', Unicode(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 es
LEFT JOIN entries e ON e.id = es.id
HAVING e.id IS NULL;

关于这样做的好处是,你没有做INSERT IGNOREREPLACE或者ON DUPLICATE KEY UPDATE,它 。

MySQL 2022/1/1 18:46:44 有331人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶