जब MySQL क्वेरी ऑप्टिमाइज़ेशन का उल्लेख किया जाता है, तो इंडेक्स सबसे पहले कवर की जाने वाली चीजों में से एक हैं। आज, हम यह देखने की कोशिश करेंगे कि वे इतने महत्वपूर्ण क्यों हैं।
सूचकांक क्या हैं?
सामान्य तौर पर, एक अनुक्रमणिका अभिलेखों की एक वर्णमाला सूची होती है जिसमें उन पृष्ठों के संदर्भ होते हैं जिन पर उनका उल्लेख किया जाता है। MySQL में, एक इंडेक्स एक डेटा संरचना है जिसका उपयोग पंक्तियों को जल्दी से खोजने के लिए किया जाता है। अनुक्रमणिका को कुंजियाँ भी कहा जाता है और वे कुंजियाँ अच्छे प्रदर्शन के लिए महत्वपूर्ण हैं - जैसे-जैसे डेटा बड़ा होता जाता है, अनुक्रमणिका का ठीक से उपयोग करने की आवश्यकता अधिक से अधिक महत्वपूर्ण हो सकती है। अनुक्रमणिका का उपयोग क्वेरी प्रदर्शन को बेहतर बनाने के सबसे शक्तिशाली तरीकों में से एक है - यदि अनुक्रमणिका का ठीक से उपयोग किया जाता है, तो क्वेरी प्रदर्शन दसियों या सैकड़ों गुना तक बढ़ सकता है।
आज, हम MySQL में अनुक्रमणिका का उपयोग करने के मूल लाभों और कमियों को समझाने का प्रयास करेंगे। ध्यान रखें कि अकेले MySQL इंडेक्स पूरी किताब के लायक हैं, इसलिए इस पोस्ट में पूरी तरह से सब कुछ शामिल नहीं होगा, लेकिन यह एक अच्छा प्रारंभिक बिंदु होगा। उन लोगों के लिए जो इस बात में रुचि रखते हैं कि इंडेक्स एक गहरे स्तर पर कैसे काम करते हैं, टेपियो लाहडेनमाकी और माइकल लीच की पुस्तक रिलेशनल डेटाबेस इंडेक्स डिज़ाइन और ऑप्टिमाइज़र को पढ़ने से अधिक जानकारी मिलनी चाहिए।
अनुक्रमणिका का उपयोग करने के लाभ
MySQL में अनुक्रमणिका का उपयोग करने के कुछ मुख्य लाभ हैं और ये इस प्रकार हैं:
- इंडेक्स WHERE क्लॉज से मेल खाने वाली पंक्तियों को तुरंत ढूंढने की अनुमति देते हैं;
- अनुक्रमणिका कुछ पंक्तियों के माध्यम से खोज से बचने में प्रश्नों की सहायता कर सकती है जिससे सर्वर को जांच करने के लिए आवश्यक डेटा की मात्रा कम हो जाती है - यदि एकाधिक अनुक्रमणिका के बीच कोई विकल्प है, तो MySQL आमतौर पर सबसे चुनिंदा अनुक्रमणिका का उपयोग करता है, जो कि ऐसा है अनुक्रमणिका जो पंक्तियों की सबसे छोटी मात्रा ढूँढती है;
- जॉइन संचालन में अन्य तालिकाओं से पंक्तियों को पुनः प्राप्त करने के लिए अनुक्रमणिका का उपयोग किया जा सकता है;
- इंडेक्स का उपयोग इंडेक्स का उपयोग करने वाले विशिष्ट कॉलम के न्यूनतम या अधिकतम मान को खोजने के लिए किया जा सकता है;
- इंडेक्स का उपयोग किसी तालिका को सॉर्ट या समूहित करने के लिए किया जा सकता है यदि संचालन किसी इंडेक्स के सबसे बाएं उपसर्ग पर किया जाता है - इसी तरह, क्वेरी ऑप्टिमाइज़र द्वारा बहु-स्तंभ अनुक्रमणिका के सबसे बाएं उपसर्ग का भी उपयोग किया जा सकता है पंक्तियों को देखने के लिए;
- डिस्क I/O को बचाने के लिए इंडेक्स का भी उपयोग किया जा सकता है - जब एक कवरिंग इंडेक्स उपयोग में होता है, तो एक क्वेरी सीधे इंडेक्स स्ट्रक्चर सेविंग डिस्क I/O से मान वापस कर सकती है।
इसी तरह, कई प्रकार के इंडेक्स होते हैं:
- INDEX एक प्रकार की अनुक्रमणिका है जहां मानों के अद्वितीय होने की आवश्यकता नहीं होती है। इस प्रकार की अनुक्रमणिका NULL मान स्वीकार करती है;
- UNIQUE INDEX अक्सर टेबल से डुप्लीकेट पंक्तियों को हटाने के लिए उपयोग किया जाता है - इस प्रकार का इंडेक्स डेवलपर्स को पंक्ति मानों की विशिष्टता को लागू करने की अनुमति देता है;
- FULLTEXT INDEX एक इंडेक्स है जो उन फ़ील्ड्स पर लागू होता है जो पूर्ण टेक्स्ट खोज क्षमताओं का उपयोग करते हैं। इस प्रकार का इंडेक्स इंडेक्स में मानों की सीधे तुलना करने के बजाय टेक्स्ट में कीवर्ड ढूंढता है;
- DESCENDING INDEX एक इंडेक्स है जो पंक्तियों को अवरोही क्रम में संग्रहीत करता है - क्वेरी ऑप्टिमाइज़र इस प्रकार के इंडेक्स का चयन करेगा जब क्वेरी द्वारा अवरोही क्रम का अनुरोध किया जाएगा। यह इंडेक्स टाइप MySQL 8.0 में पेश किया गया था;
- प्राथमिक कुंजी भी एक अनुक्रमणिका है। संक्षेप में, प्राथमिक कुंजी एक स्तंभ या स्तंभों का एक समूह है जो तालिका में प्रत्येक पंक्ति की पहचान करता है - अक्सर AUTO_INCREMENT विशेषता वाले फ़ील्ड के साथ उपयोग किया जाता है। इस प्रकार की अनुक्रमणिका NULL मानों को स्वीकार नहीं करती है और एक बार सेट हो जाने के बाद, प्राथमिक कुंजी में मानों को बदला नहीं जा सकता है।
अब, हम MySQL में अनुक्रमणिका का उपयोग करने के लाभों और कमियों दोनों के बारे में जानने का प्रयास करेंगे। हम WHERE क्लॉज से मेल खाने वाली सबसे अधिक चर्चा की जाने वाली अपसाइड - स्पीड अप क्वेरीज़ से शुरुआत करेंगे।
WHERE क्लॉज से मेल खाने वाली क्वेरीज़ को तेज़ करना
इंडेक्स का उपयोग अक्सर WHERE क्लॉज से मेल खाने वाली खोज क्वेरी को गति देने के लिए किया जाता है। एक अनुक्रमणिका ऐसे खोज कार्यों को तेज़ बनाने का कारण बहुत आसान है - अनुक्रमणिका का उपयोग करने वाली क्वेरीज़ एक पूर्ण तालिका स्कैन से बचती हैं।
WHERE क्लॉज से मेल खाने वाले प्रश्नों को तेज करने के लिए आप MySQL में EXPLAIN स्टेटमेंट का उपयोग कर सकते हैं। विवरण EXPLAIN SELECT आपको इस बारे में कुछ अंतर्दृष्टि प्रदान करना चाहिए कि MySQL क्वेरी ऑप्टिमाइज़र क्वेरी को कैसे निष्पादित करता है - यह आपको यह भी दिखा सकता है कि प्रश्न में क्वेरी इंडेक्स का उपयोग करती है या नहीं और यह किस इंडेक्स का उपयोग करती है। निम्नलिखित क्वेरी स्पष्टीकरण पर एक नज़र डालें:
mysql> EXPLAIN SELECT * FROM demo_table WHERE field_1 = “Demo” \G;
*************************** 1. row ***************************
<...>
possible_keys: NULL
key: NULL
key_len: NULL
<...>
उपरोक्त क्वेरी में अनुक्रमणिका का उपयोग नहीं किया गया है। हालांकि, अगर हम "field_1" पर एक इंडेक्स जोड़ते हैं, तो इंडेक्स का सफलतापूर्वक उपयोग किया जाएगा:
mysql> EXPLAIN SELECT * FROM demo_table WHERE field_1 = “Demo” \G;
*************************** 1. row ***************************
<...>
possible_keys: field_1
key: field_1
key_len: 43
<...>
संभव_की कॉलम उन संभावित इंडेक्स का वर्णन करता है जिन्हें MySQL चुन सकता है, कुंजी कॉलम वास्तव में चुने गए इंडेक्स का वर्णन करता है और key_len कॉलम चुनी गई कुंजी की लंबाई का वर्णन करता है।
इस मामले में, MySQL इंडेक्स में मानों का एक लुकअप करेगा और निर्दिष्ट मान वाली किसी भी पंक्ति को लौटाएगा - परिणामस्वरूप, क्वेरी तेज होगी। हालाँकि अनुक्रमणिकाएँ कुछ प्रश्नों को तेज़ करने में मदद करती हैं, लेकिन अगर आप चाहते हैं कि आपकी अनुक्रमणिकाएँ आपके प्रश्नों में मदद करें तो आपको कुछ बातों का ध्यान रखना चाहिए:
- अपने कॉलम को अलग करें - MySQL इंडेक्स का उपयोग नहीं कर सकता है यदि इंडेक्स का उपयोग किए जाने वाले कॉलम अलग-थलग नहीं हैं। उदाहरण के लिए, इस तरह की क्वेरी में इंडेक्स का इस्तेमाल नहीं किया जाएगा:
SELECT field_1 FROM demo_table WHERE field_1 + 5 = 10;
इसे हल करने के लिए, WHERE क्लॉज के बाद जाने वाले कॉलम को अकेला छोड़ दें - जितना हो सके अपनी क्वेरी को सरल बनाएं और कॉलम को अलग करें;
- पिछले वाइल्डकार्ड के साथ LIKE क्वेरी का उपयोग करने से बचें - इस मामले में, MySQL एक इंडेक्स का उपयोग नहीं करेगा क्योंकि पूर्ववर्ती वाइल्डकार्ड का अर्थ है कि टेक्स्ट से पहले कुछ भी हो सकता है। अगर आपको वाइल्डकार्ड के साथ LIKE क्वेरीज़ का उपयोग करना चाहिए और क्वेरीज़ को इंडेक्स का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि वाइल्डकार्ड सर्च स्टेटमेंट के अंत में है।
बेशक, WHERE क्लॉज से मेल खाने वाले प्रश्नों को अन्य तरीकों से भी किया जा सकता है (उदाहरण के लिए, विभाजन), लेकिन सादगी के लिए, हम इस पोस्ट में उस पर और ध्यान नहीं देंगे।
हालांकि हमारी रुचि विभिन्न प्रकार के इंडेक्स में हो सकती है, इसलिए अब हम उस पर गौर करेंगे।
कॉलम में डुप्लिकेट मानों से छुटकारा पाना - अद्वितीय अनुक्रमणिका
MySQL में UNIQUE अनुक्रमणिका का उद्देश्य एक कॉलम में मानों की विशिष्टता को लागू करना है। एक अद्वितीय अनुक्रमणिका का उपयोग करने के लिए एक अद्वितीय अनुक्रमणिका बनाएँ क्वेरी चलाएँ:
CREATE UNIQUE INDEX demo_index ON demo_table(demo_column);
You can also create a unique index when you create a table:
CREATE TABLE demo_table (
`demo_column` VARCHAR(100) NOT NULL,
UNIQUE KEY(demo_column)
);
तालिका में एक अद्वितीय अनुक्रमणिका जोड़ने के लिए बस इतना ही आवश्यक है। अब, जब आप तालिका में डुप्लिकेट मान जोड़ने का प्रयास करते हैं तो MySQL निम्न त्रुटि के साथ वापस आ जाएगा:
#1062 - Duplicate entry ‘Demo’ for key ‘demo_column’
FULLTEXT अनुक्रमणिका
एक FULLTEXT अनुक्रमणिका एक ऐसा अनुक्रमणिका है जो उन स्तंभों पर लागू होती है जो पूर्ण पाठ खोज क्षमताओं का उपयोग करते हैं। इस प्रकार की अनुक्रमणिका में स्टॉपवर्ड और खोज मोड सहित कई अनूठी क्षमताएं हैं।
InnoDB स्टॉपवर्ड सूची में 36 शब्द हैं जबकि MyISAM स्टॉपवर्ड सूची में 143 शब्द हैं। InnoDB में, स्टॉपवर्ड चर innodb_ft_user_stopword_table में सेट तालिका से प्राप्त होते हैं, अन्यथा, यदि यह चर सेट नहीं है तो वे व्युत्पन्न हैं innodb_ft_server_stopword_table चर से। यदि उन दो चरों में से कोई भी सेट नहीं है, तो InnoDB अंतर्निहित सूची का उपयोग करता है। डिफ़ॉल्ट InnoDB स्टॉपवर्ड सूची देखने के लिए, INNODB_FT_DEFAULT_STOPWORD तालिका को क्वेरी करें।
MyISAM में, स्टॉपवर्ड्स स्टोरेज/myisam/ft_static.c फ़ाइल से लिए गए हैं। ft_stopword_file चर डिफ़ॉल्ट स्टॉपवर्ड सूची को बदलने में सक्षम बनाता है। यदि यह चर एक खाली स्ट्रिंग पर सेट है, तो स्टॉपवर्ड अक्षम हो जाएंगे, लेकिन ध्यान रखें कि यदि यह चर किसी फ़ाइल को परिभाषित करता है, तो परिभाषित फ़ाइल को टिप्पणियों के लिए पार्स नहीं किया जाता है - MyISAM फ़ाइल में पाए गए सभी शब्दों को स्टॉपवर्ड के रूप में मानेगा।पी>
FULLTEXT अनुक्रमणिका अपने अद्वितीय खोज मोड के लिए भी प्रसिद्ध हैं:
- यदि बिना संशोधक वाली FULLTEXT खोज क्वेरी चलाई जाती है, तो एक प्राकृतिक भाषा मोड सक्रिय हो जाएगा। प्राकृतिक भाषा मोड को प्राकृतिक भाषा मोड संशोधक का उपयोग करके भी सक्रिय किया जा सकता है;
- QUERY EXPANSION के साथ संशोधक क्वेरी विस्तार के साथ एक खोज मोड को सक्षम करता है। ऐसा खोज मोड दो बार खोज करके काम करता है और जब खोज दूसरी बार चलाई जाती है, तो परिणाम सेट में पहली खोज से कुछ सबसे प्रासंगिक दस्तावेज़ शामिल होंगे। सामान्य तौर पर, यह संशोधक तब उपयोगी होता है जब उपयोगकर्ता के पास कुछ निहित ज्ञान होता है (उदाहरण के लिए, उपयोगकर्ता "डेटाबेस" की खोज कर सकता है और परिणाम सेट में "InnoDB" और "MyISAM" देखने की उम्मीद कर सकता है);
- इन बूलियन मोड संशोधक बूलियन ऑपरेटरों के साथ खोज करने की अनुमति देता है। उदाहरण के लिए, +, - या * ऑपरेटर प्रत्येक अलग-अलग कार्यों को पूरा करेंगे - + ऑपरेटर परिभाषित करेगा कि मान एक पंक्ति में मौजूद होना चाहिए, - ऑपरेटर परिभाषित करेगा कि मान मौजूद नहीं होना चाहिए और * ऑपरेटर एक के रूप में कार्य करेगा वाइल्डकार्ड।
FULLTEXT अनुक्रमणिका का उपयोग करने वाली क्वेरी कुछ इस प्रकार दिखाई देती है:
SELECT * FROM demo_table WHERE MATCH(demo_field) AGAINST(‘value’ IN NATURAL LANGUAGE MODE);
ध्यान रखें कि FULLTEXT इंडेक्स आम तौर पर MATCH() AGAINST() संचालन के लिए उपयोगी होते हैं - WHERE संचालन के लिए नहीं, जिसका अर्थ है कि यदि WHERE क्लॉज का उपयोग किया जाएगा, विभिन्न सूचकांक प्रकारों के उपयोग की उपयोगिता समाप्त नहीं होगी।
यह भी उल्लेखनीय है कि FULLTEXT अनुक्रमणिका में वर्णों की न्यूनतम लंबाई होती है। InnoDB में, FULLTEXT खोज केवल तभी की जा सकती है जब खोज क्वेरी में कम से कम तीन वर्ण हों - MyISAM संग्रहण इंजन में यह सीमा चार वर्णों तक बढ़ा दी जाती है।
अवरोही अनुक्रमणिका
एक डिसेंटिंग इंडेक्स एक ऐसा इंडेक्स है जहां InnoDB प्रविष्टियों को अवरोही क्रम में संग्रहीत करता है - क्वेरी ऑप्टिमाइज़र ऐसे इंडेक्स का उपयोग करेगा जब क्वेरी द्वारा अवरोही क्रम का अनुरोध किया जाता है। इस तरह के एक इंडेक्स को नीचे की तरह एक क्वेरी चलाकर कॉलम में जोड़ा जा सकता है:
CREATE INDEX descending_index ON demo_table(column_name DESC);
एक कॉलम में आरोही इंडेक्स भी जोड़ा जा सकता है - बस DESC को ASC से बदलें।
प्राथमिक कुंजियां
प्राथमिक कुंजी तालिका में प्रत्येक पंक्ति के लिए एक विशिष्ट पहचानकर्ता के रूप में कार्य करती है। प्राथमिक कुंजी वाले कॉलम में अद्वितीय मान होना चाहिए - किसी भी पूर्ण मान का उपयोग करने की अनुमति नहीं है। यदि प्राथमिक कुंजी वाले कॉलम में डुप्लिकेट मान जोड़ा जाता है, तो MySQL एक त्रुटि #1062 के साथ प्रतिक्रिया देगा:
#1062 - Duplicate entry ‘Demo’ for key ‘PRIMARY’
यदि कॉलम में एक NULL मान जोड़ा जाता है, तो MySQL एक त्रुटि #1048 के साथ प्रतिसाद देगा:
#1048 - Column ‘id’ cannot be null
प्राथमिक अनुक्रमणिका को कभी-कभी संकुल अनुक्रमणिका भी कहा जाता है (हम उनकी चर्चा बाद में करेंगे)।
आप एक साथ कई कॉलम पर इंडेक्स भी बना सकते हैं - ऐसे इंडेक्स को मल्टीकॉलम इंडेक्स कहा जाता है।
बहु-स्तंभ अनुक्रमणिका
कई कॉलम पर इंडेक्स को अक्सर गलत समझा जाता है - कभी-कभी डेवलपर्स और डीबीए सभी कॉलम को अलग-अलग इंडेक्स करते हैं या उन्हें गलत क्रम में इंडेक्स करते हैं। बहु-स्तंभ अनुक्रमणिका का उपयोग करते हुए प्रश्नों को यथासंभव प्रभावी बनाने के लिए, याद रखें कि अनुक्रमणिका में स्तंभों का क्रम जो एक से अधिक स्तंभों का उपयोग करते हैं, इस स्थान में भ्रम के सबसे सामान्य कारणों में से एक है - क्योंकि कोई "इस तरह या राजमार्ग" नहीं हैं। "सूचकांक आदेश समाधान, आपको याद रखना चाहिए कि बहु-स्तंभ अनुक्रमणिका का सही क्रम अनुक्रमणिका का उपयोग करने वाले प्रश्नों पर निर्भर करता है। हालांकि यह बहुत स्पष्ट लग सकता है, याद रखें कि मल्टीकॉलम इंडेक्स के साथ काम करते समय कॉलम ऑर्डर महत्वपूर्ण है - कॉलम ऑर्डर को इस तरह चुनें कि यह उन प्रश्नों के लिए जितना संभव हो उतना चुनिंदा है जो सबसे अधिक बार चलेंगे।
विशिष्ट स्तंभों के लिए चयनात्मकता को मापने के लिए, तालिका में पंक्तियों की कुल संख्या के लिए विशिष्ट अनुक्रमित मानों की संख्या का अनुपात प्राप्त करें - उच्च चयनात्मकता वाला स्तंभ पहला होना चाहिए ।
कभी-कभी आपको बहुत लंबे वर्ण स्तंभों को अनुक्रमित करने की भी आवश्यकता होती है, और उस स्थिति में, आप अक्सर पहले कुछ वर्णों को अनुक्रमित करके समय और संसाधनों को बचा सकते हैं - एक उपसर्ग - पूरे मान के बजाय।
उपसर्ग अनुक्रमणिका
उपसर्ग अनुक्रमणिका तब उपयोगी हो सकती है जब स्तंभों में बहुत लंबे स्ट्रिंग मान हों, जिसका अर्थ यह होगा कि पूरे स्तंभ पर एक अनुक्रमणिका जोड़ने से डिस्क स्थान की बहुत अधिक खपत होगी। MySQL आपको केवल उस मान के उपसर्ग को अनुक्रमणित करने की अनुमति देकर इस समस्या को हल करने में मदद करता है जो बदले में अनुक्रमणिका का आकार छोटा करता है। एक नज़र डालें:
CREATE TABLE `demo_table` (
`demo_column` VARCHAR(100) NOT NULL,
INDEX(demo_column(10))
);
उपरोक्त क्वेरी केवल मूल्य के पहले 10 वर्णों को अनुक्रमित करने वाले डेमो कॉलम पर एक उपसर्ग अनुक्रमणिका बनाएगी। आप किसी मौजूदा तालिका में उपसर्ग अनुक्रमणिका भी जोड़ सकते हैं:
CREATE INDEX index_name ON table_name(column_name(length));
इसलिए, उदाहरण के लिए, यदि आप किसी डेमो_टेबल पर डेमो_कॉलम के पहले 5 वर्णों को अनुक्रमित करना चाहते हैं, तो आप निम्न क्वेरी चला सकते हैं:
CREATE INDEX demo_index ON demo_table(demo_column(5));
आपको ऐसा उपसर्ग चुनना चाहिए जो चयनात्मकता देने के लिए पर्याप्त लंबा हो, लेकिन स्थान देने के लिए पर्याप्त छोटा हो। हालांकि ऐसा करना आसान कहा जा सकता है - आपको प्रयोग करने और अपने लिए कारगर समाधान खोजने की आवश्यकता है।
कवरिंग इंडेक्स
एक कवरिंग इंडेक्स किसी क्वेरी को निष्पादित करने के लिए सभी आवश्यक फ़ील्ड को "कवर" करता है। दूसरे शब्दों में, जब किसी क्वेरी में सभी फ़ील्ड एक इंडेक्स द्वारा कवर किए जाते हैं, तो एक कवरिंग इंडेक्स उपयोग में होता है। उदाहरण के लिए इस तरह की क्वेरी के लिए:
SELECT id, title FROM demo_table WHERE id = 1;
एक कवरिंग इंडेक्स इस तरह दिख सकता है:
INDEX index_name(id, title);
यदि आप यह सुनिश्चित करना चाहते हैं कि कोई क्वेरी कवरिंग इंडेक्स का उपयोग करती है, तो उस पर एक EXPLAIN स्टेटमेंट जारी करें, फिर एक्स्ट्रा कॉलम पर एक नज़र डालें। उदाहरण के लिए, यदि आपकी तालिका में आईडी और शीर्षक पर एक बहु-स्तंभ अनुक्रमणिका है और केवल इन दो स्तंभों तक पहुँचने वाली क्वेरी निष्पादित की जाती है, तो MySQL अनुक्रमणिका का उपयोग करेगा:
mysql> EXPLAIN SELECT id, title FROM demo_table \G;
*************************** 1. row ***************************
<...>
type: index
key: index_name
key_len: 5
rows: 1000
Extra: Using index
<...>
ध्यान रखें कि एक कवरिंग इंडेक्स को उसके द्वारा कवर किए गए कॉलम के मानों को स्टोर करना चाहिए। इसका मतलब है कि MySQL केवल प्रश्नों को कवर करने के लिए B-Tree अनुक्रमणिका का उपयोग कर सकता है क्योंकि अन्य प्रकार के अनुक्रमणिका इन मानों को संग्रहीत नहीं करते हैं।
क्लस्टर, सेकेंडरी इंडेक्स और इंडेक्स कार्डिनैलिटी
जब इंडेक्स पर चर्चा की जाती है, तो आप क्लस्टर्ड, सेकेंडरी इंडेक्स और इंडेक्स कार्डिनैलिटी शब्द भी सुन सकते हैं। सीधे शब्दों में कहें, क्लस्टर इंडेक्स डेटा स्टोरेज के लिए एक दृष्टिकोण है और क्लस्टर इंडेक्स के अलावा सभी इंडेक्स सेकेंडरी इंडेक्स हैं। दूसरी ओर इंडेक्स कार्डिनैलिटी इंडेक्स में अद्वितीय मानों की संख्या है।
एक संकुल अनुक्रमणिका प्रश्नों को गति देती है क्योंकि डिस्क पर एक-दूसरे के करीब मान भी संग्रहीत किए जाते हैं, लेकिन यही कारण है कि आपके पास तालिका में केवल एक संकुल अनुक्रमणिका हो सकती है।
एक द्वितीयक अनुक्रमणिका कोई भी अनुक्रमणिका है जो प्राथमिक अनुक्रमणिका नहीं है। ऐसी अनुक्रमणिका में डुप्लीकेट हो सकते हैं।
अनुक्रमणिका का उपयोग करने की कमियां
इंडेक्स का उपयोग निश्चित रूप से उल्टा है, लेकिन हमें यह नहीं भूलना चाहिए कि इंडेक्स MySQL में भी मुद्दों के प्रमुख कारणों में से एक हो सकता है। इंडेक्स का उपयोग करने की कुछ कमियां इस प्रकार हैं:
- इंडेक्स कुछ क्वेरीज़ के प्रदर्शन को ख़राब कर सकते हैं - भले ही इंडेक्स सेलेक्ट क्वेरीज़ के प्रदर्शन को तेज़ करते हैं, वे INSERT, UPDATE और DELETE क्वेरीज़ के प्रदर्शन को धीमा कर देते हैं क्योंकि जब डेटा को अपडेट किया जाता है तो इंडेक्स को भी इसके साथ अपडेट करने की आवश्यकता है:कोई भी ऑपरेशन जिसमें इंडेक्स में हेरफेर करना शामिल है, सामान्य से धीमा होगा;
- अनुक्रमणिका डिस्क स्थान का उपभोग करती है - एक अनुक्रमणिका अपना स्थान घेरती है, इसलिए अनुक्रमित डेटा अधिक डिस्क स्थान का भी उपभोग करेगा;
- अनावश्यक और डुप्लिकेट इंडेक्स एक समस्या हो सकती है - MySQL आपको एक कॉलम पर डुप्लिकेट इंडेक्स बनाने की अनुमति देता है और यह ऐसी गलती करने से "आपकी रक्षा" नहीं करता है। इस उदाहरण पर एक नज़र डालें:
CREATE TABLE `demo_table` ( `id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, `column_2` VARCHAR(10) NOT NULL, `column_3` VARCHAR(10) NOT NULL, INDEX(id), UNIQUE(id) );
एक अनुभवहीन उपयोगकर्ता सोच सकता है कि यह क्वेरी आईडी कॉलम को स्वचालित रूप से बढ़ा देती है, फिर कॉलम पर एक इंडेक्स जोड़ता है और कॉलम को डुप्लिकेट मान स्वीकार नहीं करता है। हालाँकि, यहाँ ऐसा नहीं हो रहा है। इस मामले में, एक ही कॉलम में तीन इंडेक्स होते हैं:एक सामान्य इंडेक्स, और चूंकि MySQL इंडेक्स के साथ प्राथमिक कुंजी और अद्वितीय दोनों बाधाओं को लागू करता है, जो एक ही कॉलम पर दो और इंडेक्स जोड़ता है!
निष्कर्ष
निष्कर्ष निकालने के लिए, MySQL में अनुक्रमणिका का अपना स्थान होता है - अनुक्रमणिका का उपयोग कई परिदृश्यों में किया जा सकता है, लेकिन उन उपयोग परिदृश्यों में से प्रत्येक के अपने स्वयं के नकारात्मक पहलू होते हैं, जिनका अधिकतम लाभ उठाने के लिए विचार किया जाना चाहिए। अनुक्रमणिका जो उपयोग में हैं।
इंडेक्स का अच्छी तरह से उपयोग करने के लिए, अपने प्रश्नों को प्रोफाइल करें, इंडेक्स के बारे में आपके पास कौन से विकल्प हैं, उनके लाभ और नुकसान जानें, तय करें कि आपको अपनी आवश्यकताओं के आधार पर कौन से इंडेक्स चाहिए और कॉलम इंडेक्स करने के बाद, सुनिश्चित करें कि आपके इंडेक्स हैं वास्तव में MySQL द्वारा उपयोग किया जाता है। यदि आपने अपने स्कीमा को ठीक से अनुक्रमित किया है, तो आपके प्रश्नों के प्रदर्शन में सुधार होना चाहिए, लेकिन यदि प्रतिक्रिया समय आपको संतुष्ट नहीं करता है, तो देखें कि क्या इसे बेहतर बनाने के लिए एक बेहतर अनुक्रमणिका बनाई जा सकती है।