Mysql
 sql >> база данни >  >> RDS >> Mysql

Груповата актуализация на Sqlalchemy в MySQL работи много бавно

Можете да ускорите операциите за групово актуализиране с трик, дори ако сървърът на базата данни (както във вашия случай) има много лошо забавяне. Вместо директно да актуализирате таблицата си, използвате таблица на сцена за да вмъкнете новите си данни много бързо, след това направете едно присъединяване към таблицата на местоназначението . Това също има предимството, че намалявате доста драстично броя на изявленията, които трябва да изпратите към базата данни.

Как работи това с АКТУАЛИЗАЦИИ?

Да кажем, че имате таблица 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 , които ще увеличат първичния ви ключ, дори ако няма да направят нищо .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. magento таблица sales_flat_order поле protect_code обяснение

  2. MySQL INTERVAL Мин

  3. PHP-MySQL-Как безопасно да увеличите целочисленото поле на MySQL?

  4. Създайте вложен json обект с помощта на php mysql

  5. Проблем с изпълнението на процедурата във файла schema.sql за пролетно зареждане