2010-01-21 8 views
29

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

मेरी समझ यह है कि आपको एक कॉलम में एक इंडेक्स सेट करके बहुत कुछ हासिल नहीं होता है जिसमें कुछ विशिष्ट मूल्य होंगे। मेरे पास एक कॉलम है जिसमें एक बूलियन मान होता है (वास्तव में यह एक छोटा सा int है, लेकिन मैं इसे ध्वज के रूप में उपयोग कर रहा हूं), और इस कॉलम का उपयोग मेरे अधिकांश प्रश्नों के WHERE खंडों में किया जाता है। एक सैद्धांतिक "औसत" मामले में, आधे रिकॉर्ड के मान 1 और दूसरा आधा, 0 होगा। इसलिए, इस परिदृश्य में, डेटाबेस इंजन एक पूर्ण तालिका स्कैन से बच सकता है, लेकिन फिर भी बहुत सारी पंक्तियां पढ़नी पड़ेगी (कुल पंक्तियां/2)।

तो, क्या मुझे यह कॉलम इंडेक्स बनाना चाहिए?

रिकॉर्ड के लिए, मैं माइस्क्ल 5 का उपयोग कर रहा हूं, लेकिन मुझे एक सामान्य तर्क में अधिक दिलचस्पी है कि यह एक स्तंभ को अनुक्रमणित क्यों नहीं करता है, जो मुझे पता है कि कम कार्डिनालिटी होगी।

अग्रिम धन्यवाद।

उत्तर

2

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

+0

आपके उत्तर के लिए धन्यवाद। इस मामले में, हालांकि मैं उस कॉलम पर सॉर्ट नहीं कर रहा हूं। सक्षम/अक्षम के रूप में रिकॉर्ड चिह्नित करने के लिए केवल यही है। मैं इसे मूल रूप से नरम हटाने के लिए उपयोग कर रहा हूं। यही कारण है कि मुझे इसे अधिकांश प्रश्नों के WHERE खंड में उपयोग करना होगा। –

2

आईएमएचओ यह सीमित उपयोगिता है। मुझे लगता है कि ज्यादातर मामलों में ऐसे अन्य मानदंड हैं जिनका उपयोग आप अपने प्रश्नों में फ्लैग के अलावा कर रहे हैं जो संभवतः बहुत अधिक मदद करता है।

50% पर, शायद मैं कुछ बेंचमार्किंग के साथ/बिना देख सकता हूं और देख सकता हूं कि इससे बहुत अंतर आता है या नहीं।

8

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

SELECT ... FROM Messages WHERE Deleted = 0 AND Date BETWEEN @start AND @end 

आप निश्चित रूप से करने से लाभ होगा पर एक समग्र सूचकांक हटाया गया और दिनांक फ़ील्ड।

+0

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

56

एक सूचकांक कम प्रमुखता खेतों पर भी मदद कर सकते हैं यदि:

  1. जब संभव हो मानों में से एक अन्य मूल्यों की तुलना में बहुत निराला है और आप इसके लिए खोज।

    उदाहरण के लिए, बहुत कम रंग अंधा महिलाएं हैं, तो यह प्रश्न:

    SELECT * 
    FROM color_blind_people 
    WHERE gender = 'F' 
    

    संभवत: gender पर एक सूचकांक से लाभ होगा।

  2. जब मूल्यों तालिका क्रम में वर्गीकृत किया जा करते हैं:

    SELECT * 
    FROM records_from_2008 
    WHERE year = 2010 
    LIMIT 1 
    

    हालांकि केवल 3 अलग साल यहाँ हैं, पहले के वर्षों के साथ रिकॉर्ड सबसे शायद जुड़ जाते हैं पहले तो बहुत कई रिकॉर्ड होना चाहिए था सूचकांक के लिए नहीं तो पहले 2010 रिकॉर्ड लौटने से पहले स्कैन किया गया।

  3. जब आप ORDER BY/LIMIT की जरूरत है:

    SELECT * 
    FROM people 
    ORDER BY 
         gender, id 
    LIMIT 1 
    

    सूचकांक के बिना, एक filesort की आवश्यकता होगी। हालांकि यह कुछ हद तक अनुकूलित है LIMIT पर, इसे अभी भी एक पूर्ण टेबल स्कैन की आवश्यकता होगी।

  4. जब सूचकांक क्वेरी में उपयोग सभी क्षेत्रों को शामिल किया गया: और यदि आप कुछ रंग है, इस प्रश्न के

    SELECT DISTINCT color 
    FROM tshirts 
    

    MySQLINDEX FOR GROUP-BY का उपयोग करेगा,: जब आप की जरूरत है DISTINCT

    CREATE INDEX (low_cardinality_record, value) 
    
    SELECT SUM(value) 
    FROM mytable 
    WHERE low_cardinality_record = 3 
    
  5. लाखों रिकॉर्ड के साथ भी तत्काल होगा।

    यह एक परिदृश्य का एक उदाहरण है जब कम कार्डिनालिटी फ़ील्ड पर सूचकांक अधिक उच्च कार्डिनालिटी फ़ील्ड से अधिक कुशल है।

ध्यान दें कि यदि DML प्रदर्शन किसी मुद्दे पर ज्यादा नहीं है, तो यह सुरक्षित सूचकांक बनाने के लिए है।

यदि अनुकूलक सोचता है कि सूचकांक अक्षम है, तो सूचकांक का उपयोग नहीं किया जाएगा।

संबंधित मुद्दे

 संबंधित मुद्दे