किसी अन्य से मान के साथ एक MySQL तालिका अपडेट करें


93

मैं दूसरे से मिली जानकारी के आधार पर एक MySQL टेबल को अपडेट करने की कोशिश कर रहा हूं।

मेरी originalतालिका इस प्रकार है:

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

और tobeupdatedतालिका इस प्रकार है:

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

मैं अद्यतन करना चाहते idमें tobeupdatedसाथ idसे originalके आधार पर value(में संग्रहीत तार VARCHAR(32)क्षेत्र)।

अद्यतन तालिका उम्मीद की तरह दिखाई देगी:

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

मेरे पास एक क्वेरी है जो काम करती है, लेकिन यह बहुत धीमी है:

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

यह मेरे सीपीयू को अधिकतम करता है और अंततः अपडेट किए गए अपडेट के केवल कुछ अंश के साथ एक टाइमआउट की ओर जाता है (मिलान करने के लिए कई हजार मान हैं)। मुझे पता है कि मैचिंग valueधीमी होगी, लेकिन यह एकमात्र डेटा है जो मुझे उन्हें एक साथ मिलाना है।

क्या इस तरह से मूल्यों को अपडेट करने का एक बेहतर तरीका है? मर्ज किए गए परिणामों के लिए मैं एक तीसरी तालिका बना सकता हूं, अगर यह तेजी से होगी?

मैंने MySQL की कोशिश की - मैं किसी तालिका को किसी अन्य तालिका से मानों के साथ कैसे अपडेट कर सकता हूं? , लेकिन यह वास्तव में मदद नहीं करता था। कोई विचार?

एक MySQL नौसिखिया मदद करने के लिए अग्रिम धन्यवाद!


2
क्या आपके 'मान' कॉलम में कोई इंडेक्स है?
नूडल

हाय नूडल; नहीं, valueइस समय एक सूचकांक नहीं है।
सुपरहेल

जवाबों:


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

कि यह करना चाहिए, और वास्तव में यह वही कर रहा है जो तुम्हारा है। हालाँकि, मैं कई 'WHERE' शर्तों के बजाय जॉइन के लिए 'JOIN' सिंटैक्स पसंद करता हूं, मुझे लगता है कि इसे पढ़ना आसान है

धीमी गति से चलाने के लिए, टेबल कितनी बड़ी हैं? आपके पास अनुक्रमित होना चाहिए tobeupdated.valueऔरoriginal.value

संपादित करें: हम क्वेरी को सरल भी कर सकते हैं

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

USINGशॉर्टहैंड होता है, जब किसी ज्वाइन के दोनों टेबल एक समान होते हैं keyजैसे कि नाम id। यानी एक समान रूप से शामिल हों - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join


3
धन्यवाद वायर्ड ००! यह पूरी तरह से काम करता है। टेबल काफी बड़ी हैं ( 100,000+ originalप्रविष्टियाँ और tobeupdated10,000+), इसलिए मैंने आपकी और noodl की इंडेक्स के बारे में सलाह ली और पूरी क्वेरी अब एक सेकंड के अंदर खत्म हो गई। मैं अंतर पर विश्वास नहीं कर सकता !? आपकी मदद के लिए बहुत धन्यवाद; मैंने बहुत कुछ सीखा है!
सुपरहेल

5
सुनने में बहुत अच्छा लगता है :) मैं यहाँ भी बहुत कुछ सीखता हूँ। मैं वास्तव में इस साइट को पसंद करता हूं क्योंकि आप कई अलग-अलग मुद्दों और विचारों से अवगत कराया जा सकता है
वायर्ड 00

धन्यवाद .. मैंने
स्टैकओवरफ्लो

बस यह उल्लेख करना चाहता था कि WHIN के साथ एक सरल अद्यतन जोड सिंटैक्स की तुलना में बहुत तेज था। लगभग 10.000 पंक्तियाँ।
एलेक्स 2 एफपी

1
वे मुख्य घटक सूचकांक के रूप में काम कर रहे हैं। मुझे उनके बिना टाइमआउट के विपरीत 4 सेकंड में 300K रिकॉर्ड अपडेट करने के लिए ले गया।
अमेजो

0

यह निर्भर करता है कि उन तालिकाओं का क्या उपयोग है, लेकिन आप सम्मिलित और अद्यतन पर मूल तालिका पर ट्रिगर लगाने पर विचार कर सकते हैं। जब सम्मिलित या अद्यतन किया जाता है, तो मूल तालिका से केवल एक आइटम के आधार पर दूसरी तालिका को अपडेट करें। यह जल्दी हो जाएगा।


धन्यवाद फायरगनॉम; मैंने पहले कभी ट्रिगर्स का उपयोग नहीं किया है, लेकिन मैं उन पर पढ़ना सुनिश्चित करूंगा।
सुपरहेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.