Możesz przyspieszyć operacje zbiorczej aktualizacji za pomocą sztuczki, nawet jeśli serwer bazy danych (jak w twoim przypadku) ma bardzo duże opóźnienie. Zamiast bezpośrednio aktualizować tabelę, używasz tabeli pomostowej aby bardzo szybko wstawić nowe dane, a następnie wykonaj jedną aktualizację dołączenia do tabeli docelowej . Ma to również tę zaletę, że znacznie zmniejszasz liczbę wyciągów, które musisz wysłać do bazy danych.
Jak to działa z aktualizacjami?
Załóżmy, że masz tabelę entries
i cały czas napływają nowe dane, ale chcesz zaktualizować tylko te, które już zostały zapisane. Tworzysz kopię swojej tabeli docelowej entries_stage
zawierające tylko odpowiednie pola:
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),
)
Następnie wstawiasz swoje dane za pomocą wstawiania zbiorczego. Można to przyspieszyć jeszcze bardziej, jeśli użyjesz składni wstawiania wielu wartości MySQL, która nie jest natywnie obsługiwana przez SQLAlchemy, ale można ją zbudować bez większych trudności.
INSERT INTO enries_stage (`id`, `value`)
VALUES
(1, 'string1'), (2, 'string2'), (3, 'string3'), ...;
Na koniec aktualizujesz wartości tabeli docelowej wartościami z tabeli stage w ten sposób:
UPDATE entries e
JOIN entries_stage es ON e.id = es.id
SET e.value = es.value;
Potem gotowe.
A co z wstawkami?
Oczywiście działa to również w celu przyspieszenia wstawiania. Ponieważ masz już dane w tabeli etapów , wszystko, co musisz zrobić, to wydać INSERT INTO ... SELECT
oświadczenie, z danymi, których nie ma w tabeli-docelowej jeszcze.
INSERT INTO entries (id, value)
SELECT FROM entries_stage es
LEFT JOIN entries e ON e.id = es.id
HAVING e.id IS NULL;
Zaletą tego jest to, że nie musisz robić INSERT IGNORE
, REPLACE
lub ON DUPLICATE KEY UPDATE
, które zwiększą Twój klucz podstawowy, nawet jeśli nic nie zrobią .