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

JOIN बनाम WHERE:समान परिणाम प्राप्त करने वाली दो क्वेरीज़ परिमाण प्रदर्शन अंतर के 3-4 क्रम क्यों प्रदर्शित करती हैं?

MySQL में ज्ञात समस्याएं हैं सहसंबद्ध उपश्रेणियों, या उप-चयनों से संबंधित प्रश्नों को अनुकूलित करने के साथ। संस्करण 5.6.5 तक यह उपश्रेणियों को अमल में नहीं लाता है, हालांकि यह एक व्युत्पन्न तालिका में शामिल हो जाएगा।

संक्षेप में इसका मतलब यह है कि जब आप किसी जॉइन का उपयोग करते हैं, तो पहली बार सबक्वेरी का सामना करने पर MySQL निम्नलिखित कार्य करेगा:

SELECT code1 FROM myTable GROUP BY code1 HAVING COUNT(code1) > 1

और परिणामों को एक अस्थायी तालिका में रखें (जिसे लुकअप को तेज़ बनाने के लिए हैश किया गया है), फिर myTable में प्रत्येक मान के लिए यह देखने के लिए कि क्या कोड है या नहीं, यह अस्थायी तालिका के सामने खोजेगा।

हालाँकि, जब से आप IN . का उपयोग करते हैं सबक्वेरी को अमल में नहीं लाया गया है और इसे फिर से लिखा गया है:

SELECT t1.code1, t1.code2
FROM myTable t1
WHERE EXISTS
    (   SELECT t2.code1 
        FROM myTable t2
        WHERE t2.Code1 = t1.Code1
        GROUP BY t2.code1 
        HAVING COUNT(t2.code1) > 1
    )

जिसका अर्थ है कि प्रत्येक code . के लिए myTable . में , यह सबक्वेरी फिर से चलाता है। जब आपकी बाहरी क्वेरी बहुत संकीर्ण होती है, तो ठीक है, क्योंकि यह केवल कुछ ही बार सबक्वेरी चलाने के लिए अधिक कुशल है, इसे सभी मानों के लिए चलाने और परिणामों को अस्थायी तालिका में संग्रहीत करने के लिए, हालांकि जब आपकी बाहरी क्वेरी विस्तृत होती है, तो इसका परिणाम होता है कई बार निष्पादित आंतरिक क्वेरी में, और यही वह जगह है जहां प्रदर्शन अंतर शुरू होता है।

तो आपकी पंक्ति गणना के लिए, सबक्वेरी को ~30,000 बार चलाने के बजाय, आप इसे एक बार चलाते हैं, फिर हैशेड अस्थायी तालिका के विरुद्ध ~ 30,000 पंक्तियों को केवल 400 पंक्तियों के साथ देखें। यह इस तरह के एक कठोर प्रदर्शन अंतर के लिए जिम्मेदार होगा।

ऑनलाइन डॉक्स में यह लेख सबक्वेरी ऑप्टिमाइज़ेशन को और अधिक गहराई से समझाता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आर रिटर्न में MySQL से UTF-8 टेक्स्ट लाई जा रही है ????

  2. यूनियन क्वेरी पर गिनती कैसे करें

  3. जबकि लूप के साथ MySQL सम्मिलित करें

  4. PHP + MySQL लेनदेन उदाहरण

  5. MySQL में सभी फ़ील्ड बदलें