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 .