Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pembaruan massal Sqlalchemy di MySQL bekerja sangat lambat

Anda dapat mempercepat operasi pembaruan massal dengan trik, bahkan jika server basis data (seperti dalam kasus Anda) memiliki latensi yang sangat buruk. Alih-alih memperbarui tabel Anda secara langsung, Anda menggunakan tabel panggung untuk memasukkan data baru Anda dengan sangat cepat, lalu lakukan satu pembaruan gabung ke tabel tujuan . Ini juga memiliki keuntungan bahwa Anda mengurangi jumlah pernyataan yang harus Anda kirim ke database secara drastis.

Bagaimana cara kerjanya dengan UPDATE?

Katakanlah Anda memiliki tabel entries dan Anda memiliki data baru yang masuk setiap saat, tetapi Anda hanya ingin memperbarui yang telah disimpan. Anda membuat salinan tabel tujuan entries_stage dengan hanya bidang yang relevan di dalamnya:

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

Kemudian Anda memasukkan data Anda dengan menyisipkan massal. Ini dapat dipercepat lebih jauh jika Anda menggunakan sintaks penyisipan nilai ganda MySQL, yang tidak didukung secara asli oleh SQLAlchemy, tetapi dapat dibangun tanpa banyak kesulitan.

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

Pada akhirnya, Anda memperbarui nilai tabel tujuan dengan nilai dari tabel panggung seperti ini:

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

Maka Anda selesai.

Bagaimana dengan sisipan?

Ini juga berfungsi untuk mempercepat penyisipan tentu saja. Karena Anda sudah memiliki data di tabel panggung , yang perlu Anda lakukan hanyalah mengeluarkan INSERT INTO ... SELECT pernyataan, dengan data yang tidak ada di tabel tujuan belum.

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

Hal yang menyenangkan tentang ini adalah Anda tidak perlu melakukan INSERT IGNORE , REPLACE atau ON DUPLICATE KEY UPDATE , yang akan menambah kunci utama Anda, meskipun mereka tidak melakukan apa-apa .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Peringatan#1264:kesalahan di luar jangkauan di mysql

  2. Terapkan ORDER BY pada UNION (Mysql)

  3. Mengakses basis data mysql wadah buruh pelabuhan

  4. Cara menyisipkan array ke dalam satu pernyataan MySQL Disiapkan dengan PHP dan PDO

  5. Hibernate - batasan kolom unik diabaikan