Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Masowa aktualizacja Sqlalchemy w MySQL działa bardzo wolno

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ą .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:zwróć zaktualizowane wiersze

  2. darmowy wynik pdo

  3. BŁĄD 2003 (HY000):Nie można połączyć się z serwerem MySQL na „127.0.0.1” (111)

  4. Najlepszy sposób na sprawdzenie istniejącego użytkownika w bazie danych mySQL?

  5. Ustaw wartość na NULL w MySQL