Bir MySQL tablosunu diğerinden değerlerle güncelleyin


94

Bir MySQL tablosunu diğerinden gelen bilgilere göre güncellemeye çalışıyorum.

Benim originalmasa görünüyor gibi:

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

Ve tobeupdatedmasa şöyle görünüyor:

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

Ben güncelleştirmek istediğiniz idyer tobeupdatedile idgelen originaldayalı value(saklanan dizeleri VARCHAR(32)alanında).

Güncellenen tablo umarız şöyle görünecektir:

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

Çalışan bir sorgum var ama çok yavaş:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

Bu, CPU'umu maksimuma çıkarır ve sonunda, gerçekleştirilen güncellemelerin yalnızca bir kısmıyla bir zaman aşımına yol açar (eşleşecek birkaç bin değer vardır). Eşleştirmenin valueyavaş olacağını biliyorum , ancak bunları eşleştirmem gereken tek veri bu.

Bunun gibi değerleri güncellemenin daha iyi bir yolu var mı? Daha hızlı olacaksa, birleştirilmiş sonuçlar için üçüncü bir tablo oluşturabilir miyim?

MySQL'i denedim - Bir tabloyu başka bir tablodaki değerlerle nasıl güncelleyebilirim? ama gerçekten yardımcı olmadı. Herhangi bir fikir?

Bir MySQL acemisine yardım ettiğiniz için şimdiden teşekkürler!


2
'Değer' sütununuzun bir dizini var mı?
noodl

Merhaba noodl; hayır, valueşu anda bir dizine sahip değil.
Superangel

Yanıtlar:


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

Bu onu yapmalı ve gerçekten sizin yaptığınız şeyi yapıyor. Ancak, birleştirmeler için birden çok "NEREDE" koşulu yerine "JOIN" sözdizimini tercih ediyorum, bence okunması daha kolay

Yavaş koşmaya gelince, masalar ne kadar büyük? Dizinleriniz olmalı tobeupdated.valueveoriginal.value

DÜZENLEME: sorguyu da basitleştirebiliriz

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

USING, bir birleşimin her iki tablosunun da keygibi aynı ada sahip olduğu durumların kısaltmasıdır id. yani bir eşit birleştirme - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join


3
Teşekkürler wired00! Bu mükemmel çalışıyor. Masalar (oldukça büyüktür original100.000 girdileri ve bir tobeupdatedben endeksler hakkında ve noodl tavsiyesine uydum ve bütün sorgu artık saniyenin altında bitirir nedenle, 10.000 +). Farka inanamıyorum !? Yardımın için çok teşekkürler; Çok şey öğrendim
Superangel

5
Bunu duymak harika :) Burada da çok şey öğreniyorum. Pek çok farklı sorun ve fikirle karşılaşabileceğiniz için bu siteyi gerçekten seviyorum
wired00

teşekkür ederim .. stackoverflow'dan pek çok şeyi denedim .. bu sonunda işe yaradı
Jaxx0rr

Sadece WHERE ile basit bir GÜNCELLEME'nin JOIN sözdiziminden çok daha hızlı olduğunu belirtmek istedim. Yaklaşık 10.000 sıra.
Alex2php

1
Bunların temel bileşeni elbette indeks olarak atamaktır. onlar olmadan zaman aşımları yerine 300K kayıtları 4 saniyede güncellememi sağladı.
Amjo

0

Bu tabloların ne şekilde kullanıldığına bağlıdır, ancak ekleme ve güncelleme sırasında orijinal tabloya tetikleyici koymayı düşünebilirsiniz. Ekleme veya güncelleme tamamlandığında, ikinci tabloyu orijinal tablodan yalnızca bir öğeyi temel alarak güncelleyin. Daha hızlı olacak.


Teşekkür firegnom; Daha önce hiç tetikleyici kullanmadım, ancak onları okuyacağımdan emin olacağım.
Superangel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.