2011-09-19 25 views
7

द्वारा नीचे प्रश्न देखें। तालिका में मुझे किस इंडेक्स को बनाना चाहिए ताकि क्वेरी इंडेक्स का उपयोग करे और अस्थायी और फाइलोर्ट का उपयोग करने से बचें? मैंने इंडेक्स के कई अलग-अलग संयोजनों की कोशिश की है और advice here पढ़ा है, लेकिन मुझे इसे समझने की प्रतीत नहीं हो रही है। मेरी व्याख्या या तो Using Where (कोई अनुक्रमणिका नहीं), या Using Where Using Temporary, Using Filesortसमूह के लिए MySQL सूचकांक

यहां एक सरल क्वेरी है। सभी कॉलम इंटीग्रर्स हैं।

SELECT c1, Sum(c2) 
FROM table 
WHERE c3 IS NOT NULL 
AND c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11) 
GROUP BY c1 
+1

ध्यान रखें कि MySQL केवल प्रति तालिका एक इंडेक्स का उपयोग कर सकता है, इसलिए यदि आप ग्रुप बाय को अनुकूलित करने के लिए कॉलम पर एक इंडेक्स डालते हैं तो आप खुद को चोट पहुंचाने के लिए कह सकते हैं कि WHERE क्लॉज अप्रत्याशित हैं और अंत में अधिक काम है किया जाना है (यानी पूर्ण टेबल स्कैन)। –

+3

मैं समझता हूं, लेकिन क्या एक ऐसा इंडेक्स बनाने का कोई तरीका है जिसका उपयोग ग्रुप बाय और कहां क्लॉज दोनों द्वारा किया जा सकता है? – bradvido

उत्तर

7

इससे आपकी मदद करनी चाहिए। आपकी क्वेरी पुनर्लेखन इस प्रकार है:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11) 
AND c3 IS NOT NULL 
GROUP BY c1 

अब स्तंभों पर एक समग्र सूचकांक बनाने (सी 4, सी 5, सी 6) इसी क्रम में कॉलम के साथ। आपके सूचकांक में कॉलम आपके WHERE खंड में कॉलम के समान क्रम में प्रकट होना चाहिए। अन्यथा सूचकांक काम नहीं करेगा। इस सूचकांक की चुनिंदाता इतनी संकीर्ण है कि अस्थायी तालिका (समूह द्वारा) के लिए एक फाइलोर्ट तेजी से होना चाहिए।

क्वेरी के अंत में सी 3 को स्थानांतरित करने का कारण निम्न है। उदाहरण के तौर पर, मान लीजिए कि सी 3 0 और 100 के बीच मूल्य ले सकता है (या यह शून्य हो सकता है)। यदि आप "पूर्ण नहीं है" क्वेरी चलाते हैं, तो माईस्क्ल को लगभग सभी बी-ट्री इंडेक्स को पार करने की आवश्यकता होती है जो कि नल के अनुरूप किनारों को छोड़कर। इसलिए, MySQL निर्णय लेता है कि एक पूर्ण तालिका स्कैन इंडेक्स में सभी अलग-अलग पथों के माध्यम से चलने से एक आसान विकल्प है। दूसरी ओर, आप देखेंगे कि यदि आपकी क्वेरी "आईएस न्यूल" थी और आपकी अनुक्रमणिका (सी 3, सी 4, सी 5, सी 6) थी तो माईस्क्ल इस सूचकांक का उपयोग करेगा। ऐसा इसलिए है क्योंकि इस मामले में माईस्क्ल को केवल नल मूल्य के अनुरूप इंडेक्स पेड़ के हिस्से को पार करने की आवश्यकता है।

इंडेक्स की तरह माईएसQL की जरूरत प्रश्न में पूछताछ पर बहुत अधिक निर्भर है। सभी कॉलम पर इंडेक्स बनाना, जैसा कि @ लुइस ने सुझाव दिया है, एक अच्छा विचार नहीं है!

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद! – bradvido

+5

"आपके सूचकांक में कॉलम आपके WHERE खंड में कॉलम के समान क्रम में प्रकट होना चाहिए। अन्यथा अनुक्रमणिका काम नहीं करेगी।" क्वेरी ऑप्टिमाइज़र परवाह नहीं है कि 'WHERE' क्लॉज का आदेश कैसे दिया जाता है। 'चुनें ...Foo से जहां = 1 और baz <5' में वही निष्पादन योजना होगी जैसा कि 'चुनें ... foo से जहां baz <5 और bar = 1', और इंडेक्स का उपयोग उसी तरह से करें। स्थिति का प्रकार (समानता या असमानता, चुनिंदा या नहीं) यह महत्वपूर्ण है, जहां यह 'WHERE' खंड में नहीं दिखाई देता है। – Air

+0

मुझे यकीन नहीं है कि यह सच है। मेरे अनुभव से, सूचकांक परिभाषा का आदेश महत्वपूर्ण है, लेकिन जहां खंड का आदेश नहीं है। –

-1

अनुभव से, मैं यह कहना चाहिए: (, लेकिन यहाँ C6 नहीं) "कहाँ" खंड में सभी स्तंभों के लिए अनुक्रमित निर्माण

कम से कम, सी 4 और सी 5।

"समूह द्वारा" खंड परिणाम का आदेश देगा। यदि आपके परिणामस्वरूप बहुत सारे रिकॉर्ड हैं, तो यह सी 1 सूचकांक के लिए भी उपयोगी हो सकता है।

सी 3 केवल "शून्य नहीं" के रूप में परीक्षण किया जाता है। लेकिन इसे अनुक्रमणित करने से चीजों में भी सुधार हो सकता है, इसका परीक्षण किया जाना है।

होप्स यह सहायक था।

0

मुझे विश्वास है कि यह मुद्दा 'ऑर्डर द्वारा 2 डीईएससी' के साथ है। भले ही सी 2 अनुक्रमित एसयूएम (सी 2) नहीं है।

जिसके लिए आपको 'इंडेक्स' होना चाहिए, यह डेटा पर निर्भर करता है, इसलिए मैं वास्तव में टिप्पणी नहीं कर सकता।

+0

बहस के लिए, मान लें कि मैं ऑर्डर द्वारा ऑर्डर का उपयोग नहीं कर रहा हूं। (मैंने इसे प्रश्न से हटा दिया है)। मुझे अभी भी काम करने के लिए एक सूचकांक नहीं मिल रहा है। – bradvido

संबंधित मुद्दे