RDBMSs पर "इंडेक्स" का क्या अर्थ है? [बन्द है]


21

मैं सबसे अधिक विकसित करने वालों जैसे इंडेक्स का उपयोग करता हूं (ज्यादातर ... अच्छी तरह से! इंडेक्स), लेकिन मुझे यकीन है कि इंडेक्स का उपयोग करके डेटाबेस को ऑप्टिमाइज़ करने का बहुत सूक्ष्म तरीका है। मुझे यकीन नहीं है कि यह किसी डीबीएमएस के कार्यान्वयन के लिए विशिष्ट है।

मेरा प्रश्न है: सूचकांक का उपयोग करने के अच्छे तरीके क्या हैं (मूल, स्पष्ट मामलों को छोड़कर), और जब आप किसी तालिका पर सूचकांक निर्दिष्ट करते हैं तो DBMS अपने डेटाबेस का अनुकूलन कैसे करता है?


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

मैं पुस्तकालय रूपक का उपयोग कर अनुक्रमित समझाने के लिए चाहते mysqlperformanceblog.com/2011/08/30/... देखें कि अगर मदद करता है ..
जोनाथन

जवाबों:


11

एक सूचकांक को "सामग्री की तालिका" के रूप में सोचें ... यह एक फ़ाइल, उर्फ ​​ऑफ़सेट्स में स्थिति के लिए एक आदेशित सूची है। यह कहें कि आपके पास मिलान मापदंड के लिए तालिका खोजने के बजाय किसी तालिका में लाखों रिकॉर्ड संग्रहीत हैं, यह मैचों के लिए एक ऑर्डर की गई सूची को संदर्भित करने के लिए बहुत तेज़ है, फिर पॉइंटर्स को विशिष्ट मिलान पंक्तियों में स्टैक करें। एक इंडेक्स का एक आदर्श उदाहरण एक टेबल प्राथमिक कुंजी फ़ील्ड है, जो आमतौर पर "आईडी" फ़ील्ड है। यदि आप पंक्ति आईडी # 11234566 चाहते हैं, तो यह बहुत तेजी से सूचकांक को डेटा के लिए एक संकेतक के लिए कहता है, यह स्थिति 11234566 के लिए डेटा स्रोत को स्कैन करने के लिए है।

यहाँ अनुक्रमण का इतना स्पष्ट उपयोग नहीं है:

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

आपका ऑपरेशन आपका लॉग रिकॉर्ड बना सकता है, लेकिन फिर एक अनुक्रमित डेटाटाइम का संदर्भ बनाएं जो आपकी लॉग टेबल की तुलना में खोज / सॉर्ट करने के लिए तेज़ है। फिर अपनी लॉग इन तालिका को अपनी प्राथमिक कुंजी पर वापस शामिल करें। यदि आपको इस पर विस्तार करने की आवश्यकता है, तो मुझे बताएं। मुझे लगता है कि इसका मतलब बनता है।

नमूना प्रश्न:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';

धन्यवाद, यह बहुत स्पष्ट है! आपके उदाहरण में, "प्राथमिक" जिस तरह से RDMBS "ऑफ़सेट" को संग्रहीत करता है उसे बदल देगा, या क्या यह सिर्फ विशिष्टता की कमी के लिए उपयोग किया जाता है?
थॉमस जूलिन

9

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

उदाहरण के लिए, यदि पंक्तियों के WHERE AnIntegerColumn = 42 AND AnOtherInt = 69लिए सबसे तेज़ मार्ग पंक्तियों के लिए एक बड़ी तालिका की खोज करना दो स्तंभों AnIntegerColumn और AnOtherInt पर एक सूचकांक होगा। यदि आपके पास केवल प्रत्येक व्यक्तिगत रूप से एक सूचकांक है, लेकिन कोई संयुक्त सूचकांक नहीं है, तो डीबी एक या दूसरे सूचकांक को खोजेगा और अलग-अलग परिणामों को दूसरे खंड के साथ फ़िल्टर करेगा, या दोनों को स्कैन करेगा और बाद में परिणामों से शादी करेगा।

एक और सामान्य सरल ऑपरेशन जिसे कम्पोजिट इंडेक्स के साथ बेहतर बनाया जा सकता है, वह है WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn- अगर कोई कॉनक्लूज़न और SomeOtherColumn (सही क्रम में) पर एक इंडेक्स है, तो फ़िल्टरिंग और ऑर्डरिंग ऑपरेशन कुछ परिस्थितियों में एक ही समय में किए जा सकते हैं।

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


2

डेविड और रैंडी ने इसे कवर किया है। मैं बस को जोड़ने के लिए है कि चाहता था आदेश पता लगाना है जब आप एक बड़ा एक सूचकांक बनाने, साथ ही सुझाव दे जो अनुक्रमित की जरूरत है से बाहर बचत हो जाएगा में एक विशाल मदद हो सकता है। यह उन चरणों को प्रदर्शित करेगा जो डेटाबेस आपकी क्वेरी को चलाने के लिए कर रहा है, इसलिए आप जानते हैं कि कौन से बिट सबसे लंबे समय तक ले रहे हैं।EXPLAIN


गौरव के जवाब में जोड़ने के लिए, "EXPLAIN EXTENDED" का उपयोग करें, फिर तुरंत देखें कि "क्वेरी कैसे करें" यह देखने के लिए कि आपकी क्वेरी कैसे अनुवादित है।
रैंडमक्स

1

कुछ ऐसा जो मैंने अभी तक यहाँ पर नहीं देखा है वह यह है कि जब आपके पास एक से अधिक डिस्क होती हैं तो आप संभवतः अपने इंडेक्स को एक अलग डिस्क पर रखना चाहते हैं जहाँ डेटा वास्तव में होता है। यह कुछ संचालन को गति दे सकता है। मुझे लगता है कि यह अपने आप में एक सवाल है।


यह सच हुआ करता था लेकिन इन दिनों हम कहते हैं कि मैं आपके I / O सबसिस्टम का अनुमान लगाने की कोशिश नहीं करता। आप नहीं जानते कि आपके डेटा को स्टोर करने के लिए स्टोरेज ऐरे कहां जा रहा है।
गयूस

1
@gaius मैं नहीं बल्कि मतलब यदि आप एक RAID5 (या की तरह) सेटअप नहीं था ई :, एफ पर डेटा :, आदि सूचक डाल करने के लिए
jcolebrand
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.