पहली बात जो आपको पता होनी चाहिए कि अनुक्रमणिका पूर्ण तालिका को स्कैन करने से बचने का एक तरीका है ताकि आप जिस परिणाम की तलाश कर रहे हैं।
विभिन्न प्रकार के अनुक्रमणिका हैं और वे संग्रहण परत में कार्यान्वित किए जाते हैं, इसलिए उनके बीच कोई मानक नहीं है और वे उस संग्रहण इंजन पर भी निर्भर करते हैं जिसका आप उपयोग कर रहे हैं।
InnoDB और B + ट्री इंडेक्स
InnoDB के लिए, सबसे सामान्य सूचकांक प्रकार B + ट्री आधारित सूचकांक है, जो तत्वों को क्रमबद्ध क्रम में संग्रहीत करता है। इसके अलावा, आपको अनुक्रमित मान प्राप्त करने के लिए वास्तविक तालिका तक पहुंचने की आवश्यकता नहीं है, जो आपकी क्वेरी को तेजी से वापस कर देता है।
इस इंडेक्स प्रकार के बारे में "समस्या" यह है कि आपको इंडेक्स का उपयोग करने के लिए सबसे बाईं ओर क्वेरी करनी होगी। इसलिए, यदि आपके सूचकांक में दो कॉलम हैं, तो last_name और first_name कहें, जो आदेश आप इन क्षेत्रों को क्वेरी करते हैं वह बहुत मायने रखता है ।
तो, निम्न तालिका दी गई है:
CREATE TABLE person (
last_name VARCHAR(50) NOT NULL,
first_name VARCHAR(50) NOT NULL,
INDEX (last_name, first_name)
);
यह क्वेरी सूचकांक का लाभ उठाएगी:
SELECT last_name, first_name FROM person
WHERE last_name = "John" AND first_name LIKE "J%"
लेकिन निम्नलिखित एक नहीं होगा
SELECT last_name, first_name FROM person WHERE first_name = "Constantine"
क्योंकि आप first_name
पहले कॉलम को क्वेरी कर रहे हैं और यह इंडेक्स में सबसे बाएं कॉलम नहीं है।
यह अंतिम उदाहरण और भी बुरा है:
SELECT last_name, first_name FROM person WHERE first_name LIKE "%Constantine"
क्योंकि अब, आप इंडेक्स में सबसे दाएं क्षेत्र के सबसे दाहिने हिस्से की तुलना कर रहे हैं।
हैश इंडेक्स
यह एक अलग सूचकांक प्रकार है जो दुर्भाग्य से, केवल मेमोरी बैकेंड का समर्थन करता है। यह तेज़ बिजली है, लेकिन केवल पूर्ण लुकअप के लिए उपयोगी है, जिसका अर्थ है कि आप इसका उपयोग परिचालन के लिए नहीं कर सकते हैं >
, <
या LIKE
।
चूंकि यह केवल मेमोरी बैकएंड के लिए काम करता है, आप शायद इसे बहुत बार उपयोग नहीं करेंगे। मुख्य मामला जिसके बारे में मैं अभी सोच सकता हूं, वह यह है कि आप मेमोरी में एक अस्थायी तालिका बनाते हैं, जो दूसरे चयन से परिणामों के एक सेट के साथ है और हैश इंडेक्स का उपयोग करके इस अस्थायी तालिका में कई अन्य चयन करते हैं।
यदि आपके पास एक बड़ा VARCHAR
क्षेत्र है, तो आप एक बी-ट्री का उपयोग करके, एक और कॉलम बनाकर और उस पर बड़े मूल्य के एक हैश को बचाकर हैश इंडेक्स के उपयोग का "अनुकरण" कर सकते हैं। मान लीजिए कि आप किसी फ़ील्ड में url स्टोर कर रहे हैं और मान काफी बड़े हैं। आप एक पूर्णांक फ़ील्ड भी बना सकते हैं जिसे कहा जाता है url_hash
और CRC32
इसे सम्मिलित करते समय url को हैश करने के लिए या किसी अन्य हैश फ़ंक्शन जैसे हैश फ़ंक्शन का उपयोग करें। और फिर, जब आपको इस मूल्य के लिए क्वेरी करने की आवश्यकता होती है, तो आप कुछ इस तरह से कर सकते हैं:
SELECT url FROM url_table WHERE url_hash=CRC32("http://gnu.org");
उपरोक्त उदाहरण के साथ समस्या यह है कि चूंकि CRC32
फ़ंक्शन एक बहुत छोटा हैश उत्पन्न करता है, आप हैश के मूल्यों में बहुत सारे टकराव के साथ समाप्त करेंगे। यदि आपको सटीक मान चाहिए, तो आप निम्न कार्य करके इस समस्या को ठीक कर सकते हैं:
SELECT url FROM url_table
WHERE url_hash=CRC32("http://gnu.org") AND url="http://gnu.org";
यह अभी भी हैश चीजों के लायक है भले ही टकराव की संख्या अधिक होने के कारण आप केवल दूसरी तुलना (स्ट्रिंग एक) बार-बार हैश के खिलाफ प्रदर्शन करेंगे।
दुर्भाग्य से, इस तकनीक का उपयोग करते हुए, आपको अभी भी url
फ़ील्ड की तुलना करने के लिए तालिका को हिट करने की आवश्यकता है ।
लपेटें
अनुकूलन के बारे में बात करने के लिए कुछ तथ्य जो आप हर बार विचार कर सकते हैं:
स्ट्रिंग तुलना की तुलना में पूर्णांक तुलना तेजी से होती है। यह हैश इंडेक्स के अनुकरण के बारे में उदाहरण के साथ चित्रित किया जा सकता है InnoDB
।
हो सकता है, एक प्रक्रिया में अतिरिक्त कदम जोड़ने से यह तेज हो, धीमी न हो। यह इस तथ्य से स्पष्ट किया जा सकता है कि आप SELECT
इसे दो चरणों में विभाजित करके अनुकूलित कर सकते हैं , जिससे एक नई बनाई गई मेमोरी टेबल में पहले एक स्टोर वैल्यू हो सकती है, और फिर इस दूसरी टेबल पर भारी प्रश्नों को निष्पादित कर सकते हैं।
MySQL के अन्य सूचकांक भी हैं, लेकिन मुझे लगता है कि B + ट्री एक का अब तक का सबसे अधिक उपयोग किया गया है और हैश जानने के लिए एक अच्छी बात है, लेकिन आप MySQL के दस्तावेज़ में दूसरे को ढूंढ सकते हैं ।
मैं आपको "उच्च प्रदर्शन MySQL" पुस्तक को पढ़ने के लिए अत्यधिक सलाह देता हूं, उपरोक्त उत्तर निश्चित रूप से अनुक्रमित के बारे में अपने अध्याय पर आधारित था।