即使数据库服务器(如您的情况)的延迟非常糟糕,您也可以使用技巧来加快批量更新操作的速度。不用直接更新表,而是使用 阶段表 非常快速地插入新数据,然后对目标表 进行一次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 IGNORE
,REPLACE
或者ON DUPLICATE KEY UPDATE
,它 。