इस प्रश्न का उत्तर देना इतना आसान नहीं है। आपको एक महत्वपूर्ण बात पता होनी चाहिए:MySQL IN (<static values list>)
. का व्यवहार करता है और IN (<subquery>)
अलग-अलग क्वेरी
के रूप में . पहला वाला श्रेणी तुलना . के बराबर है (जैसे .. OR = .. OR =
) जबकि दूसरा = ANY ()
. के बराबर है - और यह वही नहीं है। तो, संक्षेप में कहें:IN
. का उपयोग करके सबक्वेरी के साथ ANY()
के साथ क्वेरी का कारण बनेगा और MySQL उसके लिए अनुक्रमणिका का उपयोग नहीं करेगा, भले ही सबक्वेरी स्वतंत्र हो और मानों की स्थिर सूची returns लौटाता हो . दुख की बात है लेकिन सच है। MySQL इसका अनुमान नहीं लगा सकता है और इसलिए इंडेक्स का उपयोग नहीं किया जाएगा, भले ही यह स्पष्ट हो। यदि आप JOIN
. का उपयोग करेंगे (अर्थात अपना IN (<subquery>)
. फिर से लिखें ) - फिर MySQL JOIN
. के लिए अनुक्रमणिका का उपयोग करेगा स्थिति, यदि संभव हो तो।
अब, दूसरा मामला JOIN
. के बारे में हो सकता है और IN
विभाजन का उपयोग करते समय। यदि आप JOIN
. का उपयोग करेंगे - फिर, दुख की बात है - लेकिन MySQL भी JOIN
. के लिए विभाजन की भविष्यवाणी करने में सक्षम नहीं है सामान्य स्थिति में - और यह इसके लिए विभाजन के पूरे सेट का उपयोग करेगा। JOIN
. की जगह करने के लिए IN (<static list>)
EXPLAIN PARTITION
को बदल देगा चित्र:MySQL केवल उन विभाजनों का उपयोग करेगा, जो कि IN
के भीतर निर्दिष्ट श्रेणी से मानों का चयन करने के लिए आवश्यक हैं खंड। लेकिन, फिर से, यह IN (<subquery>)
. के साथ काम नहीं करेगा ।
निष्कर्ष के तौर पर - यह दुखद है, जब हम कह रहे हैं कि MySQL IN
को कैसे हैंडल कर रहा है? उपश्रेणियाँ - और सामान्य स्थिति में इसे JOIN
. से बदला नहीं जा सकता सुरक्षित रूप से (यह विभाजन के मामले के बारे में है)। तो, सामान्य समाधान होगा:आवेदन स्तर पर मुख्य क्वेरी से सबक्वेरी को अलग करें . यदि हम स्वतंत्र सबक्वेरी के बारे में कह रहे हैं, स्थिर मान सूची लौटा रहे हैं, तो यह सबसे अच्छा सुझाव है - तो आप उस मान सूची को IN(<static list>)
के रूप में प्रतिस्थापित कर सकते हैं और लाभ प्राप्त करें:MySQL इसके लिए अनुक्रमणिका का उपयोग करेगा, और, यदि हम विभाजन के बारे में कह रहे हैं, तो केवल वास्तव में उनसे आवश्यक ही उपयोग किया जाएगा।