sql >> Databáze >  >> RDS >> Mysql

Hromadná aktualizace Sqlalchemy v MySQL funguje velmi pomalu

Operace hromadné aktualizace můžete trikem urychlit, i když má databázový server (jako ve vašem případě) velmi špatnou latenci. Místo přímé aktualizace tabulky použijete stage-table chcete-li nová data vložit velmi rychle, proveďte jednu aktualizaci spojení do tabulky cílů . To má také tu výhodu, že poměrně dramaticky snížíte počet výpisů, které musíte do databáze posílat.

Jak to funguje s UPDATEs?

Řekněme, že máte tabulku entries a neustále vám přicházejí nová data, ale chcete aktualizovat pouze ta, která již byla uložena. Vytvoříte kopii cílové tabulky entries_stage pouze s příslušnými poli:

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),
)

Poté vložíte svá data pomocí hromadného vložení. To lze ještě urychlit, pokud použijete syntaxi MySQL pro vkládání více hodnot, která není nativně podporována SQLAlchemy, ale lze ji sestavit bez větších potíží.

INSERT INTO enries_stage (`id`, `value`)
VALUES
(1, 'string1'), (2, 'string2'), (3, 'string3'), ...;

Nakonec aktualizujete hodnoty cílové tabulky hodnotami z tabulky stage takto:

 UPDATE entries e
 JOIN entries_stage es ON e.id = es.id
 SET e.value = es.value;

Pak jste hotovi.

A co vložky?

To samozřejmě také funguje pro urychlení vložek. Protože již máte data v tabulce etap , vše, co musíte udělat, je zadat INSERT INTO ... SELECT s daty, která nejsou v tabulce cílů ještě.

INSERT INTO entries (id, value)
SELECT FROM entries_stage es
LEFT JOIN entries e ON e.id = es.id
HAVING e.id IS NULL;

Pěkné na tom je, že nemusíte dělat INSERT IGNORE , REPLACE nebo ON DUPLICATE KEY UPDATE , které zvýší váš primární klíč, i když s tím nic nedělají .




  1. Zjistit, zda je datum v letním čase v MySql

  2. MySQL JOIN s LIMIT 1 na spojeném stole

  3. Přírůstkové statistiky SQL Server 2014

  4. Omezení křížové tabulky MS SQL Serveru