Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अनुकूलन के लिए MySQL हैश इंडेक्स

सबसे पहले, आपके द्वारा उठाए जाने वाले विशिष्ट प्रश्नों से निपटने के लिए:

  1. जैसा कि CREATE INDEX के तहत प्रलेखित है सिंटैक्स :

    इसलिए, HASH . पर विचार करने से पहले अनुक्रमण, किसी को पता होना चाहिए कि यह केवल केवल है MEMORY . में उपलब्ध है और NDB भंडारण इंजन:तो हो सकता है कि आपके लिए एक विकल्प भी न हो।

    इसके अलावा, सावधान रहें कि ID . के संयोजन पर अनुक्रमणिका और Lookup अकेले इष्टतम नहीं हो सकता, क्योंकि आपका WHERE predicate भी tablea.Elg_IDpart1 . पर फ़िल्टर करता है और tableb.IDpart1 —आपको उन स्तंभों पर अनुक्रमणित करने से भी लाभ हो सकता है।

  2. बशर्ते कि वांछित अनुक्रमणिका प्रकार भंडारण इंजन द्वारा समर्थित हों, आप उन्हें अपनी इच्छानुसार मिला सकते हैं।

  3. आप इंडेक्स हिंट का इस्तेमाल कर सकते हैं MySQL को उन इंडेक्स के लिए अलग-अलग इंडेक्स का उपयोग करने के लिए मजबूर करने के लिए जिन्हें ऑप्टिमाइज़र ने अन्यथा चुना होगा।

  4. यह आमतौर पर है काफी स्मार्ट, लेकिन हमेशा नहीं। इस मामले में, हालांकि, शायद यह निर्धारित किया गया है कि इंडेक्स की कार्डिनैलिटी ऐसी है कि उन लोगों का उपयोग करना बेहतर है जिन्हें उसने चुना है।

अब, आपके द्वारा उपयोग किए जा रहे 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 . का उपयोग करके क्वेरी निष्पादन योजना की जांच करें आगे ऐसे मुद्दों की जांच करने के लिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मारियाडीबी/माईएसक्यूएल डेटाबेस पर एसक्यूएल निर्भरता

  2. क्या कमांड लाइन टूल mysqladmin में DB यूजर पासवर्ड पास करने का कोई तरीका है?

  3. 1 से फिर से शुरू होने वाले आईडी कॉलम को कैसे अपडेट करें

  4. SQL सर्वर में (MySQL) LIMIT कैसे लिखें?

  5. MySQL कनेक्टर 6.7.4 और एंटिटी फ्रेमवर्क 5 अपवाद