Saya mencoba memperbarui satu tabel MySQL berdasarkan informasi dari yang lain.
original
Tabel saya terlihat seperti:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Dan tobeupdated
tabelnya terlihat seperti:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Saya ingin memperbarui id
di tobeupdated
dengan id
dari original
berdasarkan value
(string disimpan di VARCHAR(32)
lapangan).
Tabel yang diperbarui diharapkan akan terlihat seperti:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
Saya memiliki kueri yang berfungsi, tetapi sangat lambat:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Ini memaksimalkan CPU saya dan akhirnya mengarah ke waktu tunggu dengan hanya sebagian kecil dari pembaruan yang dilakukan (ada beberapa ribu nilai yang harus dicocokkan). Saya tahu mencocokkan dengan value
akan lambat, tetapi ini adalah satu-satunya data yang saya miliki untuk mencocokkan keduanya.
Apakah ada cara yang lebih baik untuk memperbarui nilai seperti ini? Saya bisa membuat tabel ketiga untuk hasil gabungan, jika itu lebih cepat?
Saya mencoba MySQL - Bagaimana cara memperbarui tabel dengan nilai dari tabel lain? , tapi tidak terlalu membantu. Ada ide?
Terima kasih sebelumnya telah membantu pemula MySQL!
value
tidak memiliki indeks saat ini.Jawaban:
UPDATE tobeupdated INNER JOIN original ON (tobeupdated.value = original.value) SET tobeupdated.id = original.id
Itu harus dilakukan, dan benar-benar melakukan apa yang menjadi milik Anda. Namun, saya lebih suka sintaks 'JOIN' untuk join daripada beberapa kondisi 'WHERE', saya pikir ini lebih mudah dibaca
Sedangkan untuk berjalan lambat, seberapa besar tabelnya? Anda harus memiliki indeks pada
tobeupdated.value
danoriginal.value
EDIT: kami juga dapat menyederhanakan kueri
UPDATE tobeupdated INNER JOIN original USING (value) SET tobeupdated.id = original.id
USING
adalah singkatan ketika kedua tabel gabungan memiliki nama yang identikkey
sepertiid
. yaitu sebuah equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-joinsumber
original
100.000+ entri dantobeupdated
10.000+), jadi saya mengikuti saran Anda dan noodl tentang indeks dan seluruh kueri sekarang selesai dalam waktu kurang dari satu detik. Aku tidak percaya perbedaannya !? Terima kasih banyak atas bantuan Anda; Saya telah belajar banyak!Itu tergantung apa yang digunakan dari tabel-tabel itu, tetapi Anda mungkin mempertimbangkan untuk meletakkan pemicu pada tabel asli saat menyisipkan dan memperbarui. Saat penyisipan atau pembaruan selesai, perbarui tabel kedua berdasarkan hanya satu item dari tabel asli. Ini akan lebih cepat.
sumber