2012-12-17 16 views
5

मुझे mysql में विशाल डेटासेट में समस्या हो रही है और मैं इंडेक्स के कई अलग-अलग तरीकों की खोज कर रहा हूं। क्या कोई मुझे बता सकता है कि अंतर क्या है यदि मैं कई इंडेक्स कोइंडेक्स को एक साथ या अलग से घोषित करना, क्या अंतर है?

ALTER TABLE `db`.`test` ADD INDEX `someindex` (field1, field2, field3); 

अलग से घोषित करने की बजाय?

ALTER TABLE `db`.`test` ADD INDEX `f1` (field1), ADD INDEX `f2` (field2); 

कोई उन्हें एक साथ या अलग से क्यों घोषित करना चाहता है?

+0

आप केवल पहले कथन में 1 अनुक्रमणिका बना रहे हैं। यह last_name, first_name, प्रारंभिक के आधार पर एक फोन बुक खोजना होगा। दूसरा कथन दो फोन की किताबों की तरह होगा: एक last_name द्वारा और एक और पुस्तक first_name द्वारा। – Glenn

+0

[इस प्रश्न के उत्तर देखें। इसने इंडेक्स के बारे में उनका उल्लेख किया।] (Http://stackoverflow.com/questions/13892952/database-schema-confusing-index-and-constraints) –

उत्तर

6

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

  1. यदि आप जिन लोगों के अंतिम नाम स्मिथ है देखो, आप उन्हें आसानी से, क्योंकि किताब उपनाम के अनुसार क्रमबद्ध है पा सकते हैं।
  2. यदि आप जिन लोगों के पहला नाम है जॉन को देखने, टेलीफोन पुस्तक मदद नहीं करता है क्योंकि जॉन्स पुस्तक में बिखरे हुए हैं। आपको उन सभी को खोजने के लिए पूरी टेलीफोन पुस्तक को स्कैन करना होगा।
  3. तो आप एक विशिष्ट अंतिम नाम स्मिथ और एक विशिष्ट पहला नाम जॉन के साथ लोगों को देखने, किताब, क्योंकि आप पाते हैं स्मिथ एक साथ हल कर मदद करता है, और स्मिथ के उस समूह के भीतर, जॉन्स भी क्रमबद्ध क्रम में पाए जाते हैं।

आप एक टेलीफोन पुस्तक अंतिम नाम से तो नाम के अनुसार क्रमबद्ध था, तो उस पुस्तक की छंटाई ऊपर मामलों # 2 और # 3 में सहायता करेंगे, लेकिन # 1 मामला नहीं।

यह सटीक मूल्यों को देखने के लिए मामलों की व्याख्या करता है, लेकिन यदि आप मूल्यों की सीमाओं से देख रहे हैं तो क्या होगा? मान लें कि आप उन सभी लोगों को ढूंढना चाहते हैं जिनके पहले नाम जॉन हैं और जिसका अंतिम नाम 'एस' (स्मिथ, सॉंडर्स, स्टैंटन, शेरमेन इत्यादि) से शुरू होता है। जॉन्स को प्रत्येक अंतिम नाम के भीतर जे के तहत क्रमबद्ध किया जाता है, लेकिन यदि आप एस के साथ शुरू होने वाले सभी अंतिम नामों के लिए सभी जॉन्स चाहते हैं, तो जॉन्स को एक साथ समूहीकृत नहीं किया जाता है। वे फिर से बिखरे हुए हैं, इसलिए आप 'एस' से शुरू होने वाले अंतिम नाम के साथ सभी नामों को स्कैन करना चाहते हैं। जबकि अगर पहले नाम से टेलीफोन बुक का आयोजन किया गया था, तो आखिरी नाम से, आप सभी जॉन्स को एक साथ मिलेंगे, फिर जॉन्स के भीतर, सभी एस अंतिम नामों को एक साथ समूहीकृत किया जाएगा।

तो बहु-स्तंभ सूचकांक में कॉलम का क्रम निश्चित रूप से मायने रखता है। एक प्रकार की क्वेरी को इंडेक्स के लिए एक निश्चित कॉलम ऑर्डर की आवश्यकता हो सकती है। यदि आपके पास कई प्रकार के प्रश्न हैं, तो आपको अलग-अलग ऑर्डर में कॉलम के साथ उनकी सहायता करने के लिए कई अनुक्रमणिका की आवश्यकता हो सकती है।

अधिक जानकारी और उदाहरण के लिए, अपनी प्रस्तुति How to Design Indexes, Really देखते हैं। या मेरी प्रस्तुति video पर देखें।

1

डेटाबेस आमतौर पर केवल क्वेरी के साथ एक सूचकांक का उपयोग कर सकते हैं, तो यह सोचते हैं कि सभी तीन कॉलम के साथ अपने 'जहां' खंड में हैं, तो आप एकल, मिश्रित सूचकांक चाहते हैं।

हालांकि, यौगिक अनुक्रमित केवल आंशिक रूप से इस्तेमाल किया जा सकता बाएं से दाएं, इसलिए यदि आप पर, कहते हैं, बस फ़ील्ड 1 एक और प्रश्न हैं, तो यौगिक सूचकांक अभी भी उपयोग किया जाएगा। लेकिन, 'कहां' खंड में केवल फ़ील्ड 2 के साथ एक क्वेरी के लिए, उस इंडेक्स का उपयोग नहीं किया जा सकता है, और आपको केवल एक फ़ील्ड 2 या एक कंपाउंड पर एक इंडेक्स की आवश्यकता होगी, लेकिन फील्ड 2 के साथ शुरू होता है।

यह [MySQL प्रलेखन]