即使数据库服务器(如您的情况)的延迟非常糟糕,您也可以使用技巧来加快批量更新 *** 作的速度。不用直接更新表,而是使用 阶段表 非常快速地插入新数据,然后对
目标表 进行一次join-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,它
会增加你的主键,即使他们会做什么 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)