MariaDB
 sql >> डेटाबेस >  >> RDS >> MariaDB

MySQL में अनुक्रमणिका को समझना:भाग एक

MySQL में इंडेक्स एक बहुत ही जटिल जानवर हैं। हमने अतीत में MySQL इंडेक्स को कवर किया है, लेकिन हमने कभी भी उनमें गहरा गोता नहीं लगाया है - हम ब्लॉग पोस्ट की इन श्रृंखलाओं में ऐसा करेंगे। इस ब्लॉग पोस्ट को अनुक्रमणिका के लिए एक बहुत ही सामान्य मार्गदर्शिका के रूप में कार्य करना चाहिए, जबकि इन श्रृंखलाओं के अन्य भाग इन विषयों में थोड़ी गहराई से गोता लगाएँगे।

सूचकांक क्या हैं?

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

इंडेक्स क्या करते हैं?

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

MySQL अनुक्रमणिका प्रकार

जहां तक ​​MySQL का संबंध है, आपने इसके बारे में सुना होगा कि इसमें कई प्रकार के इंडेक्स होते हैं:

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

  • एक FULLTEXT INDEX - ऐसी अनुक्रमणिका का उपयोग पूर्ण पाठ खोज क्षमताओं का उपयोग करने के लिए किया जाता है। इस प्रकार का इंडेक्स इंडेक्स में मानों की सीधे तुलना करने के बजाय टेक्स्ट में कीवर्ड ढूंढता है।

  • एक UNIQUE INDEX का उपयोग अक्सर तालिका से डुप्लिकेट मानों को हटाने के लिए किया जाता है। पंक्ति मानों की विशिष्टता को लागू करता है।

  • एक प्राथमिक कुंजी भी एक अनुक्रमणिका है - इसका उपयोग अक्सर AUTO_INCREMENT विशेषता वाले फ़ील्ड के साथ किया जाता है। इस प्रकार की अनुक्रमणिका NULL मानों को स्वीकार नहीं करती है और एक बार सेट हो जाने पर, प्राथमिक कुंजी वाले कॉलम में मान को बदला नहीं जा सकता है।

  • एक DESCENDING INDEX एक इंडेक्स है जो पंक्तियों को अवरोही क्रम में संग्रहीत करता है। इस प्रकार की अनुक्रमणिका को MySQL 8.0 में पेश किया गया था - जब क्वेरी द्वारा अवरोही क्रम का अनुरोध किया जाता है तो MySQL इस प्रकार के सूचकांक का उपयोग करेगा।

MySQL में अनुक्रमणिका के लिए इष्टतम डेटा प्रकार चुनना

जहां तक ​​अनुक्रमणिका का संबंध है, यह भी ध्यान रखने की आवश्यकता है कि MySQL विभिन्न प्रकार के डेटा प्रकारों का समर्थन करता है और कुछ डेटा प्रकारों का उपयोग कुछ प्रकार के अनुक्रमणिकाओं के साथ नहीं किया जा सकता है (उदाहरण के लिए, FULLTEXT इंडेक्स का उपयोग केवल टेक्स्ट-आधारित (CHAR, VARCHAR या TEXT) कॉलम पर किया जा सकता है - उनका उपयोग किसी अन्य डेटा प्रकार पर नहीं किया जा सकता है) इसलिए वास्तव में अपने डेटाबेस डिज़ाइन के लिए इंडेक्स चुनने से पहले, उस डेटा प्रकार पर निर्णय लें जिसका आप उपयोग करने जा रहे हैं। विचाराधीन कॉलम (तय करें कि आप किस प्रकार का डेटा वर्ग स्टोर करने जा रहे हैं:क्या आप नंबर स्टोर करने जा रहे हैं? स्ट्रिंग मान? दोनों संख्याएं और स्ट्रिंग मान? आदि), फिर उन मानों की सीमा तय करें जिन्हें आप स्टोर करने जा रहे हैं (वह चुनें जो आपको नहीं लगता कि आप आगे बढ़ेंगे क्योंकि डेटा प्रकार की सीमा बढ़ाना बाद में एक समय लेने वाला कार्य हो सकता है - हम अनुशंसा करते हैं कि आप एक साधारण डेटा प्रकार का उपयोग करने का विकल्प चुनें), और यदि आप NULL का उपयोग करने का इरादा नहीं रखते हैं अपने कॉलम में मान, जब भी आप कर सकते हैं अपने फ़ील्ड को NULL के रूप में निर्दिष्ट करें - जब एक अशक्त सह lumn को अनुक्रमित किया जाता है, इसके लिए प्रति प्रविष्टि एक अतिरिक्त बाइट की आवश्यकता होती है।

MySQL में अनुक्रमणिका के लिए इष्टतम वर्ण सेट और संयोजन चुनना

डेटा प्रकारों के अलावा, यह भी ध्यान रखें कि MySQL में प्रत्येक वर्ण स्थान लेता है। उदाहरण के लिए, UTF-8 वर्णों में से प्रत्येक में 1 और 4 बाइट्स के बीच कहीं भी लग सकता है, इसलिए हो सकता है कि आप अनुक्रमण से बचना चाहें, उदाहरण के लिए, 255 वर्ण और एक निश्चित कॉलम के लिए केवल 50 या 100 वर्णों का उपयोग करें।

MySQL में अनुक्रमणिका का उपयोग करने के लाभ और कमियां

MySQL में इंडेक्स का उपयोग करने का मुख्य लाभ WHERE क्लॉज से मेल खाने वाली खोज क्वेरी का बढ़ा हुआ प्रदर्शन है - इंडेक्स WHERE क्लॉज से मेल खाने वाली SELECT क्वेरी को गति देता है क्योंकि MySQL पंक्तियों को खोजने के लिए पूरी तालिका को नहीं पढ़ता है क्वेरी के लिए प्रासंगिक। हालांकि, ध्यान रखें कि इंडेक्स की अपनी कमियां हैं। मुख्य इस प्रकार हैं:

  • इंडेक्स डिस्क स्थान का उपभोग करते हैं।

  • इंडेक्स INSERT, UPDATE और DELETE क्वेरी के प्रदर्शन को नीचा दिखाते हैं - जब डेटा अपडेट किया जाता है, तो इंडेक्स को होना चाहिए इसके साथ अपडेट किया गया।

  • MySQL एक ही समय में कई प्रकार के इंडेक्स का उपयोग करने से आपकी रक्षा नहीं करता है। दूसरे शब्दों में, आप एक ही कॉलम पर एक प्राथमिक कुंजी, एक इंडेक्स और एक अद्वितीय इंडेक्स का उपयोग कर सकते हैं - MySQL आपको ऐसी गलती करने से नहीं बचाता है।

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

उपयोग के लिए सर्वश्रेष्ठ इंडेक्स कैसे चुनें?

उपयोग करने के लिए सर्वोत्तम अनुक्रमणिका चुनने के लिए, आप MySQL के अंतर्निहित तंत्र का उपयोग कर सकते हैं। उदाहरण के लिए, आप क्वेरी व्याख्याकार - EXPLAIN क्वेरी का उपयोग कर सकते हैं। यह बताएगा कि किस तालिका का उपयोग किया जाता है, यदि इसमें विभाजन हैं या नहीं, कौन से अनुक्रमणिका का उपयोग करना संभव है और किस कुंजी (सूचकांक) का उपयोग किया जाता है। यह अनुक्रमणिका की लंबाई और आपकी क्वेरी द्वारा लौटाई गई पंक्तियों की मात्रा भी लौटाएगा:

mysql> EXPLAIN SELECT * FROM demo_table WHERE demo_field = ‘demo’\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: demo_table
   partitions: NULL
         type: ref
possible_keys: demo_field
          key: demo_field
      key_len: 1022
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

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

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

  • आपके पास कितना डेटा है? शायद इसमें से कुछ बेमानी है?

  • आप किन प्रश्नों का उपयोग करते हैं? क्या आपके प्रश्न LIKE क्लॉज का उपयोग करेंगे? ऑर्डर करने के बारे में क्या?

  • अपनी क्वेरी के प्रदर्शन को बेहतर बनाने के लिए आपको किस तरह के इंडेक्स का उपयोग करना होगा?

  • क्या आपके इंडेक्स बड़े या छोटे होंगे? क्या आपको कॉलम का आकार छोटा करने के लिए उसके उपसर्ग पर एक इंडेक्स का उपयोग करना होगा?

यह ध्यान देने योग्य है कि आपको शायद एक ही कॉलम पर कई प्रकार के इंडेक्स (जैसे बी-ट्री इंडेक्स, यूनिक इंडेक्स और प्राथमिक कुंजी) का उपयोग करने से बचना चाहिए।

अनुक्रमणिका के साथ क्वेरी प्रदर्शन में सुधार

अनुक्रमणिका के साथ क्वेरी प्रदर्शन को बेहतर बनाने के लिए, आपको अपने प्रश्नों पर एक नज़र डालने की आवश्यकता है - EXPLAIN कथन इसमें मदद कर सकता है। सामान्य तौर पर, यदि आप चाहते हैं कि आपकी अनुक्रमणिका आपके प्रश्नों के प्रदर्शन को बेहतर बनाए, तो आपको कुछ बातों पर ध्यान देना चाहिए:

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

  • यदि आप सटीक मानों की खोज करते हैं तो एक बी-ट्री इंडेक्स उपयुक्त हो सकता है (उदाहरण के लिए डेमो_टेबल से चुनें * WHERE some_field ='x') या यदि आप वाइल्डकार्ड का उपयोग करके मूल्यों की खोज करना चाहते हैं (उदाहरण के लिए * डेमो_टेबल से चुनें जहां some_field 'डेमो%' पसंद है - इस मामले में, ध्यान रखें कि शुरुआत में किसी भी चीज़ के साथ LIKE प्रश्नों का उपयोग करना हो सकता है अच्छे से अधिक नुकसान - आपके द्वारा खोजे जा रहे पाठ के सामने प्रतिशत चिह्न के साथ LIKE प्रश्नों का उपयोग करने से बचें - इस तरह MySQL एक अनुक्रमणिका का उपयोग नहीं कर सकता है क्योंकि यह नहीं जानता कि पंक्ति मान किससे शुरू होता है) - हालांकि ध्यान रखें कि बी-ट्री इंडेक्स का उपयोग उन अभिव्यक्तियों में कॉलम तुलना के लिए भी किया जा सकता है जो बराबर (=), (>) से अधिक, (> =) से अधिक या बराबर, (<) से कम या बराबर का उपयोग करते हैं। (<=) या ऑपरेटरों के बीच।

  • एक FULLTEXT अनुक्रमणिका उपयुक्त हो सकती है यदि आप स्वयं को पूर्ण-पाठ का उपयोग करते हुए पाते हैं (MATCH ... AGAINST( )) खोज क्वेरी या यदि आपका डेटाबेस इस तरह से डिज़ाइन किया गया है कि केवल टेक्स्ट-आधारित कॉलम का उपयोग करता है - FULLTEXT इंडेक्स टेक्स्ट, CHAR या VARCHAR कॉलम का उपयोग कर सकते हैं, उनका उपयोग किसी अन्य प्रकार के कॉलम पर नहीं किया जा सकता है।

  • यदि आप बड़ी टेबलों पर अतिरिक्त I/O पठन के बिना क्वेरी चलाना चाहते हैं तो एक कवरिंग इंडेक्स उपयोगी हो सकता है . एक कवरिंग इंडेक्स बनाने के लिए, क्वेरी द्वारा उपयोग किए गए WHERE, GROUP BY और SELECT क्लॉज को कवर करें।

हम आगे इस ब्लॉग श्रृंखला के आगामी भागों में अनुक्रमणिका के प्रकारों पर गौर करेंगे, लेकिन सामान्य तौर पर, यदि आप SELECT * FROM डेमो_टेबल जैसे प्रश्नों का उपयोग करते हैं जहां some_field ='x' a B-tree INDEX एक फिट हो सकता है, यदि आप MATCH() AGAINST() प्रश्नों का उपयोग करते हैं, तो आपको शायद एक FULLTEXT अनुक्रमणिका में देखना चाहिए, यदि आपकी तालिका में बहुत लंबी पंक्ति मान हैं, तो आपको शायद कॉलम के एक हिस्से को अनुक्रमणित करने पर ध्यान देना चाहिए।

आपके पास कितने इंडेक्स होने चाहिए?

यदि आपने कभी अपनी SELECT क्वेरी के प्रदर्शन को बेहतर बनाने के लिए इंडेक्स का उपयोग किया है, तो आपने शायद खुद से एक प्रश्न पूछा है:वास्तव में आपके पास कितने इंडेक्स होने चाहिए? इसे समझने के लिए आपको निम्नलिखित बातों का ध्यान रखना होगा:

  1. सूचकांक आमतौर पर बड़ी मात्रा में डेटा के साथ सबसे प्रभावी होते हैं।

  2. MySQL एक क्वेरी में प्रत्येक SELECT स्टेटमेंट के लिए केवल एक इंडेक्स का उपयोग करता है (सबक्वेरी को अलग स्टेटमेंट के रूप में देखा जाता है) - उपयोग करें EXPLAIN क्वेरी यह पता लगाने के लिए कि आपके द्वारा उपयोग की जाने वाली क्वेरी के लिए कौन से इंडेक्स सबसे प्रभावी हैं।

  3. इंडेक्स को डिस्क स्थान पर बहुत अधिक समझौता किए बिना आपके सभी SELECT स्टेटमेंट को तेजी से बनाना चाहिए - "काफी तेज" , हालांकि, सापेक्ष है इसलिए आपको प्रयोग करने की आवश्यकता होगी।

इंडेक्स और स्टोरेज इंजन

MySQL में अनुक्रमणिका के साथ काम करते समय, यह भी ध्यान रखें कि यदि आप विभिन्न इंजनों का उपयोग करते हैं तो कुछ प्रकार की सीमाएँ हो सकती हैं (उदाहरण के लिए यदि आप InnoDB के विपरीत MyISAM का उपयोग करते हैं)। हम एक अलग ब्लॉग में और अधिक विस्तार में जाएंगे, लेकिन यहां कुछ विचार दिए गए हैं:

  • प्रति MyISAM और InnoDB तालिकाओं में अनुक्रमित की अधिकतम संख्या 64 है, दोनों में प्रति अनुक्रमणिका स्तंभों की अधिकतम संख्या स्टोरेज इंजन 16 है।

  • InnoDB के लिए अधिकतम कुंजी लंबाई 3500 बाइट्स है - MyISAM के लिए अधिकतम कुंजी लंबाई 1000 बाइट्स है।

  • पूर्ण टेक्स्ट इंडेक्स की कुछ स्टोरेज इंजनों में सीमाएं होती हैं - उदाहरण के लिए, InnoDB फुलटेक्स्ट इंडेक्स में 36 स्टॉपवर्ड होते हैं, MyISAM स्टॉपवर्ड सूची 143 स्टॉपवर्ड के साथ थोड़ी बड़ी है। InnoDB इन स्टॉपवर्ड्स को innodb_ft_server_stopword_table वैरिएबल से प्राप्त करता है जबकि MyISAM इन स्टॉपवर्ड्स को स्टोरेज/myisam/ft_static.c फ़ाइल से प्राप्त करता है - फ़ाइल में पाए जाने वाले सभी शब्दों को स्टॉपवर्ड के रूप में माना जाएगा।

  • MyISAM एकमात्र स्टोरेज इंजन था जो MySQL 5.6 (MySQL 5.6.6) तक पूर्ण-पाठ खोज विकल्पों के समर्थन के साथ था। 4 सटीक होने के लिए) का अर्थ है कि InnoDB MySQL 5.6.4 के बाद से पूर्ण-पाठ अनुक्रमणिका का समर्थन करता है। जब कोई FULLTEXT अनुक्रमणिका उपयोग में होती है, तो वह अनुक्रमणिका में मानों की सीधे तुलना करने के बजाय पाठ में कीवर्ड ढूंढता है।

  • InnoDB के लिए इंडेक्स एक बहुत ही महत्वपूर्ण भूमिका निभाते हैं - InnoDB जब पंक्तियों को एक्सेस करता है तो उन्हें लॉक कर देता है, इसलिए कम संख्या में पंक्तियाँ InnoDB पहुँच ताले को कम कर सकती है।

  • MySQL आपको एक ही कॉलम पर डुप्लिकेट इंडेक्स का उपयोग करने की अनुमति देता है।

  • कुछ स्टोरेज इंजन में कुछ डिफ़ॉल्ट प्रकार के इंडेक्स होते हैं (उदाहरण के लिए मेमोरी स्टोरेज इंजन के लिए डिफ़ॉल्ट इंडेक्स प्रकार हैश है) )

सारांश

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कठपुतली के साथ डेटाबेस स्वचालन:MySQL और मारियाडीबी गैलेरा क्लस्टर की तैनाती

  2. स्वीडन की नई इलेक्ट्रॉनिक पहचान फ़्रीजा eID . के पीछे डेटाबेस स्वचालन

  3. कैसे POW () मारियाडीबी में काम करता है

  4. मारियाडीबी में संयोजन दिखाएं

  5. कैसे MONTH () मारियाडीबी में काम करता है