MySQL में दो सिंगल-कॉलम इंडेक्स बनाम एक दो-कॉलम इंडेक्स?


113

मैं निम्नलिखित का सामना कर रहा हूं और मुझे यकीन नहीं है कि सबसे अच्छा अभ्यास क्या है।

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

आईडी पीके | giver_id FK | प्राप्तकर्ता_एड एफके | तारीख

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

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

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

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


1
यदि दो स्तंभों का संयोजन अद्वितीय है, तो आप अनूठी विशेषता के साथ एक दो-स्तंभ सूचकांक बना सकते हैं, जो न केवल आपकी क्वेरी की गति बढ़ाएगा, बल्कि आपकी तालिका में स्थिरता भी जोड़ देगा।
sguven

"MySQL प्रश्नों के लिए कई-कॉलम इंडेक्स का उपयोग कर सकता है जो इंडेक्स के सभी कॉलमों का परीक्षण करते हैं, या केवल पहले कॉलम का परीक्षण करने वाले क्वेरीज़, पहले दो कॉलम, पहले तीन कॉलम, और इसी तरह। यदि आप दाईं ओर कॉलम निर्दिष्ट करते हैं। इंडेक्स डेफिनिशन में ऑर्डर, एक ही कंपोजिट इंडेक्स एक ही टेबल पर कई तरह के प्रश्नों को गति दे सकता है। " - मल्टीपल-कॉलम अनुक्रमणिका
AlikElzin-kilaka

@ User1585784 पर एक्सट्रपलेशन करने के लिए; यदि दो स्तंभों का संयोजन अद्वितीय है, तो मुझे लगता है कि किसी को उनके लिए एक अद्वितीय कुंजी का उपयोग करना चाहिए। वास्तव में, यदि कोई डेटाबेस स्तर पर विशिष्टता को लागू करना चाहता है, तो एक अद्वितीय कुंजी सबसे आसान तरीका है ...
Erk

जवाबों:


132

यदि आपके पास दो एकल स्तंभ अनुक्रमणिकाएँ हैं, तो उनमें से केवल एक का उपयोग आपके उदाहरण में किया जाएगा।

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

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

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


1
"MySQL प्रश्नों के लिए कई-कॉलम इंडेक्स का उपयोग कर सकता है जो इंडेक्स के सभी कॉलमों का परीक्षण करते हैं, या केवल पहले कॉलम का परीक्षण करने वाले क्वेरीज़, पहले दो कॉलम, पहले तीन कॉलम, और इसी तरह। यदि आप दाईं ओर कॉलम निर्दिष्ट करते हैं। इंडेक्स डेफिनिशन में ऑर्डर, एक ही कंपोजिट इंडेक्स एक ही टेबल पर कई तरह के प्रश्नों को गति दे सकता है। " - मल्टीपल-कॉलम अनुक्रमणिका
AlikElzin-kilaka

33

एक कवर सूचकांक जैसे:

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id);

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

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


10
MySQL can only use one index per SELECTयह अब और सच नहीं है, यह अच्छा होगा यदि आप अपडेट किए जाने वाले अपने उत्तर को संपादित करते हैं।
डावोर

क्या आप यह समझाना चाहेंगे कि आवरण सूचकांक का उपयोग क्यों नहीं किया जा सकेगा recipient_id?
इवो ​​परेरा

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

"SELECT प्रति एक सूचकांक" , क्या यह अभी भी mariadb 10.1 के लिए सही है?
ओल्डबॉय

1
@Anthony: नहीं, ऊपर Davor द्वारा टिप्पणी देखें।
कपाट

4

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

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


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

2

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


क्या आप इसके आस-पास के कुछ दस्तावेज़ों से लिंक कर सकते हैं। धन्यवाद।
कपाट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.