सबसे पहले, आपके द्वारा उठाए जाने वाले विशिष्ट प्रश्नों से निपटने के लिए:
-
जैसा कि
CREATE INDEX
के तहत प्रलेखित है सिंटैक्स :इसलिए,
HASH
. पर विचार करने से पहले अनुक्रमण, किसी को पता होना चाहिए कि यह केवल केवल हैMEMORY
. में उपलब्ध है औरNDB
भंडारण इंजन:तो हो सकता है कि आपके लिए एक विकल्प भी न हो।इसके अलावा, सावधान रहें कि
ID
. के संयोजन पर अनुक्रमणिका औरLookup
अकेले इष्टतम नहीं हो सकता, क्योंकि आपकाWHERE
predicate भीtablea.Elg_IDpart1
. पर फ़िल्टर करता है औरtableb.IDpart1
—आपको उन स्तंभों पर अनुक्रमणित करने से भी लाभ हो सकता है। -
बशर्ते कि वांछित अनुक्रमणिका प्रकार भंडारण इंजन द्वारा समर्थित हों, आप उन्हें अपनी इच्छानुसार मिला सकते हैं।
-
आप इंडेक्स हिंट का इस्तेमाल कर सकते हैं MySQL को उन इंडेक्स के लिए अलग-अलग इंडेक्स का उपयोग करने के लिए मजबूर करने के लिए जिन्हें ऑप्टिमाइज़र ने अन्यथा चुना होगा।
-
यह आमतौर पर है काफी स्मार्ट, लेकिन हमेशा नहीं। इस मामले में, हालांकि, शायद यह निर्धारित किया गया है कि इंडेक्स की कार्डिनैलिटी ऐसी है कि उन लोगों का उपयोग करना बेहतर है जिन्हें उसने चुना है।
अब, आपके द्वारा उपयोग किए जा रहे MySQL के संस्करण के आधार पर, सबक्वेरी से प्राप्त तालिकाओं में कोई अनुक्रमणिका नहीं हो सकती है जिसका उपयोग आगे की प्रक्रिया के लिए किया जा सकता है:फलस्वरूप b
के साथ जुड़ना उस व्युत्पन्न तालिका के पूर्ण स्कैन की आवश्यकता हो सकती है (आपके प्रश्न में यह निर्धारित करने के लिए अपर्याप्त जानकारी है कि यह कितनी समस्या हो सकती है, लेकिन schema1.tableb
1.5 मिलियन रिकॉर्ड होने से पता चलता है कि यह एक महत्वपूर्ण कारक हो सकता है)।
देखें सबक्वायरी ऑप्टिमाइज़ेशन अधिक जानकारी के लिए।
इसलिए यदि संभव हो तो व्युत्पन्न तालिकाओं के उपयोग से बचने का प्रयास करना चाहिए। इस मामले में, आपकी व्युत्पन्न तालिका का कोई उद्देश्य प्रतीत नहीं होता है क्योंकि कोई बस schema1.tablea
में शामिल हो सकता है। और schema1.tableb
सीधे:
UPDATE schema1.tablea a
JOIN schema1.tableb b USING (ID, Lookup)
SET a.Elg_IDpart1 = b.IDpart1,
a.Elg_IDpart2 = b.IDpart2
WHERE a.Elg_IDpart1 IS NULL
AND a.ID IS NOT NULL
AND b.IDpart1 IS NOT NULL
AND b.Lookup IS NOT NULL
ORDER BY ID, Lookup
केवल एक चीज जो खो गई है वह है DISTINCT
. के लिए फ़िल्टर रिकॉर्ड, लेकिन डुप्लीकेट रिकॉर्ड अपडेट किए गए मानों को फिर से उन्हीं मानों के साथ अधिलेखित कर देंगे (प्रयास करेंगे)—जिसका कोई प्रभाव नहीं होगा, लेकिन यह बहुत महंगा साबित हो सकता है (विशेषकर उस तालिका में इतने सारे रिकॉर्ड के साथ)।
ORDER BY
. का उपयोग व्युत्पन्न तालिका में व्यर्थ था क्योंकि UPDATE
के लिए किसी विशेष आदेश को प्राप्त करने के लिए इस पर भरोसा नहीं किया जा सकता था , जबकि इस संशोधित संस्करण में यह सुनिश्चित करेगा कि पिछले वाले को अधिलेखित करने वाला कोई भी अद्यतन निर्दिष्ट क्रम में हो:लेकिन क्या यह आवश्यक है? शायद इसे हटाया जा सकता है और किसी सॉर्टिंग ऑपरेशन पर सहेजा जा सकता है।
किसी को WHERE
. में विधेय की जांच करनी चाहिए खंड:क्या वे सभी आवश्यक हैं (NOT NULL
a.ID
. पर जांच करता है और b.Lookup
, उदाहरण के लिए, अनावश्यक हैं क्योंकि ऐसा कोई भी NULL
JOIN
. द्वारा रिकॉर्ड्स को हटा दिया जाएगा विधेय)?
कुल मिलाकर, यह हमें छोड़ देता है:
UPDATE schema1.tablea a
JOIN schema1.tableb b USING (ID, Lookup)
SET a.Elg_IDpart1 = b.IDpart1,
a.Elg_IDpart2 = b.IDpart2
WHERE a.Elg_IDpart1 IS NULL
AND b.IDpart1 IS NOT NULL
केवल अगर प्रदर्शन अभी भी असंतोषजनक है, तो किसी को अनुक्रमण पर आगे देखना चाहिए। प्रासंगिक कॉलम हैं (अर्थात जो JOIN
. में उपयोग किए गए हैं और WHERE
विधेय) अनुक्रमित? क्या इंडेक्स को MySQL द्वारा उपयोग के लिए चुना जा रहा है (ध्यान रखें कि यह केवल एक . का उपयोग कर सकता है लुकअप के लिए प्रति टेबल इंडेक्स:JOIN
दोनों के परीक्षण के लिए भविष्यवाणी करें और फ़िल्टर भविष्यवाणी करता है:शायद आपको उचित समग्र अनुक्रमणिका की आवश्यकता है)? EXPLAIN
. का उपयोग करके क्वेरी निष्पादन योजना की जांच करें आगे ऐसे मुद्दों की जांच करने के लिए।