Perbarui satu tabel MySQL dengan nilai dari yang lain

93

Saya mencoba memperbarui satu tabel MySQL berdasarkan informasi dari yang lain.

originalTabel saya terlihat seperti:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

Dan tobeupdatedtabelnya terlihat seperti:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

Saya ingin memperbarui iddi tobeupdateddengan iddari originalberdasarkan 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 valueakan 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!

Superangel
sumber
2
Apakah kolom 'nilai' Anda memiliki indeks?
noodl
Hai noodl; tidak, valuetidak memiliki indeks saat ini.
Superangel

Jawaban:

211
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.valuedanoriginal.value

EDIT: kami juga dapat menyederhanakan kueri

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USINGadalah singkatan ketika kedua tabel gabungan memiliki nama yang identik keyseperti id. yaitu sebuah equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

kabel00
sumber
3
Terima kasih wired00! Ini bekerja dengan sempurna. Tabelnya cukup besar ( original100.000+ entri dan tobeupdated10.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!
Superangel
5
Senang mendengarnya :) Saya belajar banyak di sini juga. Saya sangat menyukai situs ini karena Anda dapat melihat banyak masalah dan ide yang berbeda
wired00
terima kasih .. Saya mencoba banyak hal dari stackoverflow .. yang ini akhirnya berhasil
Jaxx0rr
Hanya ingin menyebutkan bahwa UPDATE sederhana dengan WHERE jauh lebih cepat daripada sintaks JOIN. Sekitar 10.000 baris.
Alex2php
1
Bahan utama mereka tentu saja menetapkan sebagai indeks. membawa saya untuk memperbarui 300K catatan dalam 4 detik dibandingkan dengan batas waktu tanpa mereka.
Amjo
0

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.

firegnom
sumber
Terima kasih firegnom; Saya belum pernah menggunakan pemicu sebelumnya, tetapi saya pasti akan membacanya.
Superangel