2010-02-28 13 views
65

मुझे निम्नलिखित का सामना करना पड़ रहा है और मुझे यकीन नहीं है कि सबसे अच्छा अभ्यास क्या है।दो सिंगल-कॉलम इंडेक्स बनाम MySQL में एक दो कॉलम इंडेक्स बनाम?

निम्न तालिका (जो बड़े मिल जाएगा) पर विचार करें:

आईडी पी | giver_id एफके | प्राप्तकर्ता_आईडी एफके | दिनांक

मैं इनो डीबी का उपयोग कर रहा हूं और जो मैं समझता हूं, वह दो विदेशी कुंजी कॉलम के लिए स्वचालित रूप से इंडेक्स बनाता है। हालांकि, मैं बहुत सारे प्रश्न भी करूँगा जहां मुझे किसी विशेष संयोजन से मिलान करने की आवश्यकता है:

SELECT...WHERE giver_id = x AND recipient_id = t

प्रत्येक ऐसा संयोजन तालिका में अद्वितीय होगा।

क्या इन कॉलम पर दो कॉलम इंडेक्स जोड़ने से कोई फायदा है, या सिद्धांत में दो अलग-अलग इंडेक्स पर्याप्त/समान होंगे?

उत्तर

76

यदि आपके पास दो सिंगल कॉलम इंडेक्स हैं, तो उनमें से केवल एक ही आपके उदाहरण में उपयोग किया जाएगा।

यदि आपके पास दो कॉलम वाले इंडेक्स हैं, तो क्वेरी तेज हो सकती है (आपको मापना चाहिए)। एक कॉलम इंडेक्स को एक कॉलम इंडेक्स के रूप में भी इस्तेमाल किया जा सकता है, लेकिन केवल पहले सूचीबद्ध कॉलम के लिए।

कभी कभी यह (ए, बी) और (बी) पर एक और सूचकांक पर एक सूचकांक के लिए उपयोगी हो सकता है। यह या तो दोनों या दोनों कॉलम का उपयोग कर क्वेरी बनाता है, लेकिन निश्चित रूप से अधिक डिस्क स्थान का भी उपयोग करता है।

इंडेक्स चुनते समय, आपको डालने, हटाने और अपडेट करने पर भी प्रभाव पर विचार करने की आवश्यकता है। अधिक अनुक्रमणिका = धीमे अद्यतन।

21

एक कवर सूचकांक की तरह:

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id); 

... मतलब यह होगा कि सूचकांक यदि एक प्रश्न giver_id में भेजा, या giver_id और recipient_id का एक संयोजन में इस्तेमाल किया जा सकता है। ध्यान दें कि सूचकांक मानदंड बाएं सबसे ऊपर आधारित है - केवल recipient_id का जिक्र करने वाली एक क्वेरी मेरे द्वारा दिए गए बयान में कवर इंडेक्स का उपयोग करने में सक्षम नहीं होगी।

साथ ही, MySQL केवल प्रति का चयन करें तो एक कवर सूचकांक आपके प्रश्नों के अनुकूलन का सबसे अच्छा साधन हो सकता है एक सूचकांक का उपयोग कर सकते हैं।

+4

'MySQL केवल SELECT' प्रति एक सूचकांक यह सच नहीं है अब और उपयोग कर सकते हैं, यह अच्छा होगा यदि आप अद्यतन करने की अपने जवाब संपादित किया जाएगा। – Davor

+0

आप को समझाने के लिए क्यों कवर सूचकांक 'recipient_id' द्वारा प्रयोग की जाने में सक्षम नहीं होगा देंगे? –

+2

MySQL में @IvoPereira मल्टी स्तंभ अनुक्रमणिका बाएं से दाएं आप सूचकांक में सभी क्षेत्रों का उपयोग करते हैं। उदाहरण के लिए यदि आप एक 'सूचकांक (col1, col2, col3, col4) है' तो सूचकांक खोजों के लिए के साथ लागू किया जाएगा एक '' WHERE' col1 = 'A'' या 'col1 =' ए 'और col2 तरह खंड = 'B'' या 'col1 =' ए 'और col2 =' बी 'और col3 =' सी 'और col4 =' डी '', लेकिन इस विशेष सूचकांक जैसे 'कुछ भी के लिए उपयोग नहीं किया जाएगा जहां col2 =' बी ' 'या 'जहां कॉल 3 =' सी 'और col4 =' डी '' क्योंकि खोज फ़ील्ड इंडेक्स परिभाषा में सबसे अधिक नहीं छोड़े गए हैं। आपको उन क्षेत्रों को कवर करने के लिए अतिरिक्त इंडेक्स जोड़ना होगा। – Slicktrick

3

यदि विदेशी कुंजी इंडेक्स में से एक पहले से ही बहुत चुनिंदा है, तो डेटाबेस इंजन को आपके द्वारा निर्दिष्ट क्वेरी के लिए उस का उपयोग करना चाहिए। अधिकांश डेटाबेस इंजन उस स्थिति में इष्टतम सूचकांक चुनने में सक्षम होने के लिए किसी प्रकार का हेरिस्टिक का उपयोग करते हैं। यदि न तो सूचकांक स्वयं द्वारा अत्यधिक चुनिंदा है, तो शायद यह दोनों कुंजीों पर बनाए गए इंडेक्स को जोड़ने का अर्थ है क्योंकि आप कहते हैं कि आप उस प्रकार की क्वेरी का बहुत उपयोग करेंगे।

विचार करने की एक और बात यह है कि यदि आप इस तालिका में पीके क्षेत्र को खत्म कर सकते हैं और प्राथमिक कुंजी इंडेक्स को giver_id और recipient_id फ़ील्ड पर परिभाषित कर सकते हैं। आपने कहा कि संयोजन अद्वितीय है, इसलिए संभवतः काम करेगा (कई अन्य स्थितियों को देखते हुए केवल आप ही जवाब दे सकते हैं)। आमतौर पर, हालांकि, मुझे लगता है कि जो अतिरिक्त जटिलता जोड़ती है वह परेशानी के लायक नहीं है।

+0

धन्यवाद मार्क, कुंजियों में से एक तो यह ठीक होना चाहिए वास्तव में बहुत चयनात्मक है। मैंने दो (स्वचालित) इंडेक्स को जगह में रखने का विकल्प चुना है और देखें कि यह समय के साथ कैसा प्रदर्शन करता है। मैंने एक संयुक्त दाता के बारे में भी सोचा: प्राप्तकर्ता प्राथमिक कुंजी, लेकिन प्रत्येक फ़ील्ड को व्यक्तिगत रूप से खोजने योग्य होने की भी आवश्यकता है, यह केवल php ओवरहेड जोड़ देगा। साथ ही, नई कुंजी एक (छोटी) पूर्णांक की बजाय एक (लंबी) स्ट्रिंग होगी। – Tom

0

एक और बात पर विचार करना है कि दोनों तरीकों में से प्रदर्शन विशेषताओं आकार और डेटासेट के प्रमुखता के आधार पर किया जाएगा। आप पाते हैं कि 2-कॉलम इंडेक्स केवल एक निश्चित डेटासेट आकार सीमा, या सटीक विपरीत पर अधिक प्रदर्शन करने वाला दिखता है।आपके सटीक परिदृश्य के लिए प्रदर्शन मीट्रिक के लिए कुछ भी विकल्प नहीं हो सकता है।

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