Можете да ускорите операциите за групово актуализиране с трик, дори ако сървърът на базата данни (както във вашия случай) има много лошо забавяне. Вместо директно да актуализирате таблицата си, използвате таблица на сцена за да вмъкнете новите си данни много бързо, след това направете едно присъединяване към таблицата на местоназначението . Това също има предимството, че намалявате доста драстично броя на изявленията, които трябва да изпратите към базата данни.
Как работи това с АКТУАЛИЗАЦИИ?
Да кажем, че имате таблица 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;
Тогава сте готови.
Ами вложките?
Това, разбира се, работи и за ускоряване на вмъкванията. Тъй като вече разполагате с данните в таблицата на сцената , всичко, което трябва да направите, е да издадете INSERT INTO ... SELECT
изявление с данните, които не са в таблица-назначение все още.
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
, които ще увеличат първичния ви ключ, дори ако няма да направят нищо .