MySQL अनुक्रमणिका: बनाएं, जोड़ें और हटाएं ट्यूटोरियल

⚡ स्मार्ट सारांश

MySQL इंडेक्स ट्यूटोरियल में बताया गया है कि इंडेक्स डेटा को कैसे सॉर्ट करते हैं और उसे तेज़ी से कैसे खोजते हैं। इंडेक्स एक सॉर्टेड लुकअप स्ट्रक्चर है जो एक या अधिक कॉलम पर बनाया जाता है; CREATE INDEX इसे जोड़ता है, SHOW INDEXES इसकी जांच करता है, और DROP INDEX इसे तब हटाता है जब राइट-हैवी टेबल में रीड-हैवी डेटा की तुलना में डेटा अधिक होता है।

  • 📚 इंडेक्स को डिक्शनरी की तरह समझें: वे कॉलम के मानों को क्रमबद्ध करते हैं ताकि इंजन पूरी तालिका को स्कैन किए बिना पंक्तियों का पता लगा सके।
  • टेबल पर या उसके बाद बनाएं: CREATE TABLE फ़ंक्शन में इंडेक्स को सीधे परिभाषित करें या किसी लाइव टेबल पर CREATE INDEX फ़ंक्शन के साथ इसे बाद में जोड़ें।
  • 🔍 SHOW INDEXES कमांड का उपयोग करके निरीक्षण करें: प्रत्येक इंडेक्स, कुंजी भाग, कार्डिनैलिटी और विशिष्टता फ़्लैग को सूचीबद्ध करने के लिए SHOW INDEXES FROM table_name कमांड का उपयोग करें।
  • 🧹 जब लेखन लागत बहुत अधिक हो तो इसे बंद कर दें: इंडेक्स INSERT और UPDATE ऑपरेशनों को धीमा कर देते हैं — राइट थ्रूपुट को वापस पाने के लिए DROP INDEX कमांड का उपयोग करके अप्रयुक्त इंडेक्स को हटा दें।
  • 🤖 इंडेक्स डिजाइन के लिए एआई का उपयोग करें: एआई सहायक धीमी क्वेरी लॉग पढ़ते हैं, कंपोजिट इंडेक्स के लिए कॉलम ऑर्डर सुझाते हैं और EXPLAIN प्लान को पंक्ति दर पंक्ति समझाते हैं।

MySQL सूचकांक अवधारणा

क्या है एक MySQL अनुक्रमणिका?

An अनुक्रमणिका in MySQL इंडेक्स एक डेटा संरचना है जो कॉलम के मानों को क्रमबद्ध तरीके से संग्रहीत करती है ताकि इंजन पंक्तियों को जल्दी से खोज सके। डेटा को फ़िल्टर करने के लिए सबसे अधिक उपयोग किए जाने वाले कॉलम या कॉलमों पर इंडेक्स बनाए जाते हैं। इंडेक्स को वर्णानुक्रम में क्रमबद्ध सूची की तरह समझें: क्रमबद्ध सूची में नाम खोजना अव्यवस्थित सूची की तुलना में कहीं अधिक तेज़ होता है।

इंडेक्सिंग के कुछ नुकसान भी हैं — हर INSERT या UPDATE ऑपरेशन को इंडेक्स को बनाए रखना पड़ता है, इसलिए किसी ऐसी टेबल पर बहुत सारे इंडेक्स जोड़ने से, जिस पर बहुत ज्यादा डेटा लिखा जाता है, समग्र प्रदर्शन पर बुरा असर पड़ सकता है। एक सामान्य नियम के तौर पर, उन कॉलम को इंडेक्स करें जो WHERE, JOIN और ORDER BY क्लॉज़ में आते हैं और जिन्हें लिखने की तुलना में पढ़ने की आवृत्ति अधिक होती है।

इंडेक्स का उपयोग क्यों करें?

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

MySQL सूचकांक अवधारणा

धीमी प्रतिक्रिया समय आमतौर पर डिस्क पर पंक्तियों के भौतिक क्रम में संग्रहीत होने के कारण होता है। बिना इंडेक्स के, MySQL किसी प्रेडिकेट से मेल खाने वाली पंक्तियों को खोजने के लिए प्रत्येक पंक्ति को स्कैन करना आवश्यक है — इसे "पूर्ण तालिका स्कैन" कहते हैं। इंडेक्स की मदद से MySQL सीधे मिलान करने वाली पंक्तियों पर जाएं, जो बी-ट्री लुकअप के लिए क्वेरी प्लान को O(n) से लगभग O(log n) में बदल देता है।

वाक्यविन्यास: इंडेक्स बनाएं

एक इंडेक्स को दो स्थानों पर परिभाषित किया जा सकता है:

  1. टेबल बनाते समय।
  2. टेबल पहले से मौजूद होने के बाद।

उदाहरण: CREATE TABLE के साथ एक इंडेक्स बनाएं

के लिए myflixdb डेटाबेस में, हमें पूर्ण-नाम कॉलम पर बहुत सारी खोजों की उम्मीद है। नीचे दिया गया स्क्रिप्ट एक नया कॉलम बनाता है। members_indexed तालिका जिसमें सूचकांक है full_names स्तंभ.

CREATE TABLE `members_indexed` (
    `membership_number` INT(11) NOT NULL AUTO_INCREMENT,
    `full_names`        VARCHAR(150) DEFAULT NULL,
    `gender`            VARCHAR(6)   DEFAULT NULL,
    `date_of_birth`     DATE         DEFAULT NULL,
    `physical_address`  VARCHAR(255) DEFAULT NULL,
    `postal_address`    VARCHAR(255) DEFAULT NULL,
    `contact_number`    VARCHAR(75)  DEFAULT NULL,
    `email`             VARCHAR(255) DEFAULT NULL,
    PRIMARY KEY (`membership_number`),
    INDEX (`full_names`)
) ENGINE = InnoDB;

स्क्रिप्ट को निष्पादित करें MySQL वर्कबेंच के विरुद्ध myflixdb डेटाबेस।

सदस्यों_अनुक्रमित तालिका में MySQL कार्यक्षेत्र

ताज़ा करना myflixdb नया देखने के लिए members_indexed मेज़। full_names अब कॉलम नीचे दिखाई देता है अनुक्रमित नोड।

सदस्यता बढ़ने के साथ-साथ खोज प्रश्नों में भी वृद्धि होती है। members_indexed जो WHERE और ORDER BY का उपयोग करते हैं full_names ये मूल सर्वर पर समान प्रश्नों की तुलना में कहीं अधिक तेज़ हैं। members बिना इंडेक्स वाली तालिका।

टेबल पहले से मौजूद होने के बाद इंडेक्स जोड़ें

आपको अक्सर यह पता चलेगा कि किसी मौजूदा टेबल को इंडेक्स की आवश्यकता है — सर्च क्वेरी धीमी होती हैं और EXPLAIN प्लान WHERE में दिखाई देने वाले कॉलम पर पूर्ण टेबल स्कैन दिखाता है। CREATE INDEX यह कथन तालिका को पुनः निर्मित किए बिना एक सूचकांक जोड़ता है।

CREATE INDEX `id_index` ON `table_name` (`column_name`);

ठोस उदाहरण — खोजों की गति बढ़ाना title का कॉलम movies तालिका:

CREATE INDEX `title_index` ON `movies` (`title`);

प्रत्येक क्वेरी जो फ़िल्टर करती है movies.title अब यह नए इंडेक्स द्वारा समर्थित है। अन्य कॉलम पर फ़िल्टर करने वाली क्वेरीज़ अभी भी टेबल को स्कैन करती हैं, जब तक कि उनका अपना इंडेक्स न हो।

नोट: जब आपकी क्वेरी हमेशा एक ही संयोजन पर फ़िल्टर या सॉर्ट करती है, तो आप कई कॉलमों पर एक मिश्रित इंडेक्स बना सकते हैं। क्रम महत्वपूर्ण है - पहला कॉलम यह निर्धारित करता है कि इंडेक्स का उपयोग किया जा सकता है या नहीं।

किसी तालिका पर अनुक्रमणिकाएँ सूचीबद्ध करें

उपयोग SHOW INDEXES किसी टेबल पर परिभाषित सभी इंडेक्स देखने के लिए।

SHOW INDEXES FROM `table_name`;

उदाहरण — सूची अनुक्रमणिकाएँ movies तालिका:

SHOW INDEXES FROM `movies`;

स्टेटमेंट को चलाएँ MySQL कार्यक्षेत्र के खिलाफ myflixdb मौजूदा इंडेक्स और उनमें शामिल कॉलम देखने के लिए।

नोट: प्राथमिक और विदेशी कुंजियों को स्वचालित रूप से अनुक्रमित किया जाता है MySQLप्रत्येक इंडेक्स का एक अद्वितीय नाम होता है और उसमें उन कॉलमों की सूची होती है जिन्हें वह कवर करता है।

सिंटैक्स: ड्रॉप इंडेक्स

उपयोग DROP INDEX किसी टेबल से मौजूदा इंडेक्स को हटाने के लिए। यह तब उपयोगी होता है जब किसी ऐसी टेबल की गति धीमी हो रही हो जिस पर बहुत अधिक डेटा लिखा जाता है, और वह इंडेक्स पढ़ने के मामले में अपना महत्व खो रहा हो।

DROP INDEX `index_id` ON `table_name`;

ठोस उदाहरण — इसे छोड़ दें full_names अनुक्रमणिका से members_indexed:

DROP INDEX `full_names` ON `members_indexed`;

के प्रकार MySQL अनुक्रमित

MySQL यह कई प्रकार के इंडेक्स का समर्थन करता है, जिनमें से प्रत्येक अलग-अलग कार्यभार के लिए उपयुक्त है।

प्रकार उद्देश्य
प्राथमिक कुंजी अद्वितीय पंक्ति पहचानकर्ता; InnoDB में तालिका डेटा के साथ क्लस्टर किया गया।
अद्वितीय यह एक इंडेक्स के रूप में कार्य करते हुए विशिष्टता को लागू करता है।
अनुक्रमणिका (बी-ट्री) रेंज क्वेरी और समानता लुकअप के लिए उपयोग किया जाने वाला डिफ़ॉल्ट सेकेंडरी इंडेक्स।
पूर्ण पाठ MATCH … AGAINST सुविधा के साथ प्राकृतिक भाषा पाठ खोज के लिए अनुकूलित।
स्थानिक POINT और POLYGON जैसे GIS डेटा प्रकारों के लिए R-ट्री इंडेक्स।
HASH स्थिर समय समानता खोज; इसका उपयोग मेमोरी स्टोरेज इंजन द्वारा किया जाता है।
मिश्रित (बहु-स्तंभ) कई कॉलमों को एक ही इंडेक्स में संयोजित करता है; सबसे बाईं ओर वाले उपसर्ग नियम का पालन करता है।

के लिए सर्वोत्तम अभ्यास MySQL अनुक्रमित

नीचे दी गई आदतें इंडेक्स को उपयोगी बनाए रखती हैं और उन्हें निरर्थक होने से रोकती हैं।

  • क्वेरी पैटर्न के लिए इंडेक्स, कॉलम नाम के लिए नहीं: ऐसे इंडेक्स जोड़ें जो वास्तविक WHERE, JOIN और ORDER BY क्लॉज़ से मेल खाते हों, न कि "हर उस कॉलम से जो महत्वपूर्ण लगता हो"।
  • समग्र सूचकांक क्रम देखें: इंडेक्स का उपयोग करने के लिए क्वेरी में अग्रणी कॉलम का होना आवश्यक है।
  • डुप्लिकेट इंडेक्स से बचें: एक मिश्रित अनुक्रमणिका का अग्रणी उपसर्ग पहले से ही उस उपसर्ग पर एकल-स्तंभ खोजों को कवर करता है।
  • EXPLAIN के साथ निरीक्षण करें: यह सुनिश्चित करें कि प्लानर वास्तव में नया इंडेक्स चुन रहा है।
  • अप्रयुक्त इंडेक्स हटाएँ: उपयोग sys.schema_unused_indexes in MySQL 5.7+ उन इंडेक्स को खोजने के लिए जिन्हें कोई नहीं पढ़ता है।
  • डेटा प्रकारों का मिलान करें: यदि WHERE क्लॉज़ किसी VARCHAR कॉलम की तुलना किसी संख्या से करता है, तो अंतर्निहित कास्ट के कारण इंडेक्स का उपयोग नहीं किया जा सकता है।

अक्सर पूछे जाने वाले प्रश्न

प्राथमिक कुंजी प्रत्येक पंक्ति को विशिष्ट रूप से पहचानती है और हमेशा अनुक्रमित होती है। एक सामान्य अनुक्रमणिका खोज प्रक्रिया को गति देती है लेकिन इसमें दोहराए गए मानों की संभावना रहती है। प्रत्येक प्राथमिक कुंजी एक अनुक्रमणिका होती है, लेकिन प्रत्येक अनुक्रमणिका प्राथमिक कुंजी नहीं होती।

बहुत छोटी तालिकाओं, बहुत कम भिन्न मानों वाले स्तंभों (कम कार्डिनैलिटी) और उन तालिकाओं पर इंडेक्स बनाने से बचें जिनमें पढ़ने की तुलना में कहीं अधिक बार डेटा लिखा जाता है। प्रत्येक अतिरिक्त इंडेक्स INSERT, UPDATE और DELETE प्रक्रियाओं को धीमा कर देता है।

एक मिश्रित (बहु-स्तंभ) सूचकांक एक ही सूचकांक में एक से अधिक स्तंभों को शामिल करता है। यह सबसे बाईं ओर के उपसर्ग नियम का पालन करता है, इसलिए यह उन प्रश्नों को हल कर सकता है जो पहले स्तंभ, पहले दो स्तंभों आदि पर फ़िल्टर करते हैं, लेकिन केवल दूसरे स्तंभ पर नहीं।

रन EXPLAIN SELECT स्टेटमेंट के सामने। कुंजी कॉलम दिखाता है कि ऑप्टिमाइज़र ने कौन सा इंडेक्स चुना है, जबकि टाइप और पंक्तियाँ इससे आपको पता चलेगा कि एक्सेस पाथ कुशल है या नहीं।

कवरिंग इंडेक्स में क्वेरी के लिए आवश्यक सभी कॉलम होते हैं, इसलिए इंजन टेबल को पढ़े बिना केवल इंडेक्स से ही क्वेरी का उत्तर देता है। ऐसा होने पर EXPLAIN "इंडेक्स का उपयोग कर रहा है" रिपोर्ट करता है।

सामान्य कारणों में रैप शामिल हैping फ़ंक्शन में कॉलम (WHERE YEAR(col) = …), अप्रत्यक्ष प्रकार कास्ट, बहुत कम कार्डिनैलिटी, और बासी सांख्यिकी। चलाएँ ANALYZE TABLE आंकड़ों को रीफ्रेश करने और निरीक्षण करने के लिए EXPLAIN असली कारण के लिए।

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

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

इस पोस्ट को संक्षेप में इस प्रकार लिखें: