MySQL में INDEX, PRIMARY, UNIQUE, FULLTEXT के बीच अंतर?


610

MySQL टेबल बनाते समय PRIMARY, UNIQUE, INDEX और FULLTEXT में क्या अंतर हैं?

मैं उनका उपयोग कैसे करूंगा?


3
इसके अलावा किसी के लिए उत्सुक SPATIAL: stackoverflow.com/questions/2256364/…
सिंह

पायथन में एक द्वितीयक सूचकांक के साथ एक प्राथमिक की तुलना के लिए इस पोस्ट को देखें stackoverflow.com/questions/59918440/secondary-index-in-python
Athanassios

जवाबों:


674

मतभेद

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

  • UNIQUE एक इंडेक्स को संदर्भित करता है जहां इंडेक्स की सभी पंक्तियां अद्वितीय होनी चाहिए। अर्थात्, एक ही पंक्ति में इस पंक्ति के सभी स्तंभों के लिए समान पंक्ति के समान गैर-पूर्ण मान नहीं हो सकता है। के रूप में अच्छी तरह से कुछ रिकॉर्ड रेंज तक पहुँचने के लिए इस्तेमाल किया जा रहा है, UNIQUE अनुक्रमित डेटा पर प्रतिबंध लागू करने के लिए इस्तेमाल किया जा सकता है, क्योंकि डेटाबेस सिस्टम डेटा डालने या अद्यतन करते समय अलग-अलग मान नियम को तोड़ने की अनुमति नहीं देता है।

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

  • PRIMARY बिल्कुल एक UNIQUE इंडेक्स की तरह काम करता है, सिवाय इसके कि इसे हमेशा 'PRIMARY' नाम दिया जाता है, और एक मेज पर केवल एक ही हो सकता है (और हमेशा एक होना चाहिए ; हालांकि कुछ डेटाबेस सिस्टम इसे लागू नहीं करते हैं)। एक प्राथमिक सूचकांक को एक प्राथमिक साधन के रूप में तालिका में किसी भी पंक्ति को विशिष्ट रूप से पहचानने के लिए अभिप्रेत है, इसलिए UNIQUE के विपरीत इसका उपयोग किसी भी स्तंभ पर नहीं किया जाना चाहिए जो NULL मानों की अनुमति देता है। आपका प्राथमिक सूचकांक उन स्तंभों की सबसे छोटी संख्या पर होना चाहिए जो किसी पंक्ति को विशिष्ट रूप से पहचानने के लिए पर्याप्त हैं। अक्सर, यह केवल एक कॉलम होता है जिसमें एक अद्वितीय ऑटो-इन्क्रिम्ड नंबर होता है, लेकिन अगर कोई और चीज़ है जो किसी पंक्ति को विशिष्ट रूप से पहचान सकती है, जैसे कि देशों की सूची में "कंट्रीकोड", तो आप इसके बजाय इसका उपयोग कर सकते हैं।

    कुछ डेटाबेस सिस्टम (जैसे कि MySQL के InnoDB) डिस्क पर एक तालिका के रिकॉर्ड को उस क्रम में संग्रहीत करेंगे, जिसमें वे PRIMARY इंडेक्स में दिखाई देते हैं।

  • FULLTEXT इंडेक्स उपरोक्त सभी से अलग हैं, और उनका व्यवहार डेटाबेस सिस्टम के बीच काफी भिन्न होता है। पूर्ण पाठ अनुक्रमणिका केवल उपर्युक्त तीनों के विपरीत MATCH () / AGAINST () क्लॉज के साथ की गई पूर्ण पाठ खोजों के लिए उपयोगी होती हैं, जिन्हें आमतौर पर बी-ट्रीज़ (बाएं कॉलम से शुरू होने वाली, छंटाई या छांटने की अनुमति) का उपयोग करके आंतरिक रूप से लागू किया जाता है हैश टेबल (बाएं अधिकांश कॉलम से चयन शुरू करने की अनुमति)।

    जहाँ अन्य अनुक्रमणिका प्रकार सामान्य-उद्देश्य होते हैं, एक फुलटेक्ट इंडेक्स विशिष्ट होता है, इसमें यह एक संकीर्ण उद्देश्य प्रदान करता है: इसका उपयोग केवल "पूर्ण पाठ खोज" सुविधा के लिए किया जाता है।

समानताएँ

  • इन सभी अनुक्रमणिकाओं में एक से अधिक स्तंभ हो सकते हैं।

  • FULLTEXT के अपवाद के साथ, कॉलम ऑर्डर महत्वपूर्ण है: इंडेक्स को क्वेरी में उपयोगी होने के लिए, क्वेरी को बाएं से शुरू होने वाले इंडेक्स के कॉलम का उपयोग करना होगा - यह सिर्फ दूसरे, तीसरे या चौथे भाग का उपयोग नहीं कर सकता है सूचकांक, जब तक कि यह स्थिर मानों से मेल खाने के लिए सूचकांक में पिछले कॉलम का उपयोग नहीं कर रहा है। (क्वेरी के लिए उपयोगी होने के लिए एक पूर्णांक सूचकांक के लिए, क्वेरी को सूचकांक के सभी स्तंभों का उपयोग करना चाहिए ।)


2
क्या इसका मतलब यह है कि यदि आप अपने प्रश्नों में MATCH () / AGAINST () का उपयोग नहीं करते हैं तो फुलटेक्स्ट इंडेक्स अनिवार्य रूप से बेकार और अंतरिक्ष की कमर है।
user1397417

5
हाँ। इसका उपयोग केवल MySQL पर MyISAM डेटाबेस के लिए किया जाता है, न कि InnoDB पर। अन्य डेटाबेस सर्वर में समान विशेषताएं हो सकती हैं जो अलग तरीके से काम कर सकती हैं।
थोमसट्रेटर

"इसका उपयोग किसी भी कॉलम पर नहीं किया जाना चाहिए जो NULL मानों की अनुमति देता है" -> यह "का उपयोग नहीं किया जा सकता है"। प्राथमिक कुंजी आवश्यक हैं NOT NULL। MySQL रिपोर्ट करेगा show columnsकि एक गैर-पूर्ण अद्वितीय कुंजी एक प्राथमिक कुंजी है, अगर कोई अन्य प्राथमिक कुंजी परिभाषित नहीं है।
गॉर्डन लिनॉफ़

1
यहाँ तर्क यह है कि NULL को खुद के बराबर नहीं माना जाता है .. Lol मैं इसे नहीं भूलूँगा
होज मर्करी

2
@thomasrutter MySQL संस्करण 5.6 से InnoDB में FULLTEXT का समर्थन कर रहा है
मारेक

151

ये सभी सूचकांक के प्रकार हैं।

प्राथमिक: अद्वितीय होना चाहिए, एक सूचकांक है, (संभावना है) भौतिक सूचकांक है, केवल एक प्रति तालिका हो सकती है।

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

सूचकांक: यदि यह प्राथमिक या अद्वितीय नहीं है, तो यह तालिका में डाले गए मूल्यों को विवश नहीं करता है, लेकिन यह उन्हें अधिक कुशलता से देखने की अनुमति देता है।

फुलटेक्स्ट: अनुक्रमण का अधिक विशिष्ट रूप जो पूर्ण पाठ खोज की अनुमति देता है। इसे (आवश्यक रूप से) निर्दिष्ट कॉलम में प्रत्येक "शब्द" के लिए "इंडेक्स" बनाएं।


32
प्राथमिक MySQL (और कई अन्य DBs) में समग्र अर्थात बहु-कुंजी हो सकते हैं। वे सिर्फ एक विशेष सूचकांक हैं। अनोखा वास्तव में एक सूचकांक नहीं है, यह एक बाधा है (जिसे उचित समय में लागू करने के लिए सूचकांक की आवश्यकता होती है, इस प्रकार एक बनाता है)।
MBCook

19

मुझे लगता है कि यह अच्छी तरह से कवर किया गया है, शायद निम्नलिखित को छोड़कर:

  • यदि चयनात्मकता पर्याप्त है तो सरल KEY/ INDEX(या अन्यथा कहा जाता है SECONDARY INDEX) प्रदर्शन बढ़ाएँ। इस मामले पर, सामान्य अनुशंसा यह है कि यदि परिणाम में रिकॉर्ड की मात्रा जिस पर एक सूचकांक लागू किया जाता है वह मूल तालिका के रिकॉर्ड की कुल राशि का 20% से अधिक है, तो सूचकांक अप्रभावी होगा। व्यवहार में प्रत्येक वास्तुकला अलग होगी लेकिन, विचार अभी भी सही है।

  • द्वितीयक सूचकांक (और यह mysql के लिए बहुत विशिष्ट है) को प्राथमिक कुंजी से पूरी तरह से अलग और विभिन्न वस्तुओं के रूप में नहीं देखा जाना चाहिए। वास्तव में, दोनों का संयुक्त रूप से उपयोग किया जाना चाहिए और, एक बार जब यह जानकारी ज्ञात हो, तो mysql DBA को एक अतिरिक्त उपकरण प्रदान करें: मैसूरल में, इंडेक्स प्राथमिक कुंजी को एम्बेड करते हैं। यह महत्वपूर्ण प्रदर्शन सुधार की ओर जाता है, खासकर जब चतुराई से अंतर्निहित कवरिंग इंडेक्स जैसे कि वहां वर्णित है

  • यदि आपको लगता है कि आपका डेटा होना चाहिए UNIQUE, तो एक अद्वितीय सूचकांक का उपयोग करें। आपको लगता है कि यह वैकल्पिक हो सकता है (उदाहरण के लिए, इसे एप्लिकेशन स्तर पर काम करना) और यह एक सामान्य सूचकांक करेगा, लेकिन यह वास्तव में मैसकल के लिए एक गारंटी का प्रतिनिधित्व करता है कि प्रत्येक पंक्ति अद्वितीय है, जो संयोगवश एक प्रदर्शन लाभ प्रदान करती है।

  • आप केवल Innodb (MySQL 5.6.4 और ऊपर) और Myisam इंजन के साथ FULLTEXT(या अन्यथा कहे गए SEARCH INDEX) का उपयोग कर सकते हैं

  • आप केवल उपयोग कर सकते हैं FULLTEXTपर CHAR, VARCHARऔर TEXTस्तंभ प्रकार
  • FULLTEXTसूचकांक में एक सूचकांक बनाने से ज्यादा एक बहुत कुछ शामिल है। सिस्टम टेबल का एक गुच्छा बनाया गया है, एक पूरी तरह से अलग कैशिंग सिस्टम और कुछ विशिष्ट नियम और अनुकूलन लागू किए गए हैं। Http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html और http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html देखें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.