2012-12-08 10 views
10

मैं इस बारे में सब कुछ पढ़ रहा हूं कि क्लस्टर इंडेक्स कैसे काम करते हैं, और सोचते हैं कि वे मेरे ऐप के लिए फायदेमंद होंगे। मैं समझता हूं कि प्राथमिक कुंजी स्वचालित रूप से क्लस्टर इंडेक्स हैं, लेकिन आप गैर-प्राथमिक कुंजी कॉलम में क्लस्टर्ड इंडेक्स कैसे जोड़ेंगे?MySQL आप क्लस्टर्ड इंडेक्स कैसे बनाते हैं?

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

उत्तर

13

Clustered and Secondary Indexes के अनुसार, आपके पास प्रति तालिका केवल एक क्लस्टर सूचकांक हो सकता है।

क्लस्टर इंडेक्स के अलावा सभी इंडेक्स को माध्यमिक इंडेक्स के रूप में जाना जाता है।

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

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

तो, मैं निष्कर्ष निकालना होगा, कि आप एक क्लस्टर सूचकांक अपने आप को जोड़ नहीं है, लेकिन MySQL या तो प्राथमिक या संकुल अनुक्रमणिका के रूप में एक तालिका के पहले अद्वितीय सूचकांक चुनता है।

7

जैसा कि @ ओलाफ वर्णन करता है, इनो डीबी चुनता है कि कौन सा कॉलम या कॉलम संयोजन क्लस्टर्ड इंडेक्स होगा (प्राथमिक कुंजी, या प्राथमिक कुंजी अगर कोई प्राथमिक कुंजी नहीं है, या छुपा कॉलम यदि दो में से कोई भी नहीं है)।

आप संकुल अनुक्रमणिका के रूप में एक गैर-अद्वितीय स्तंभ करना चाहते हैं, तो आप एक अद्वितीय कुंजी के रूप में post_id को परिभाषित करने और user_id और post_id प्राथमिक कुंजी जो क्लस्टर सूचकांक के रूप में चुना जाएगा के संयोजन कर सकता है:

CREATE TABLE Post 
(post_id INT NOT NULL AUTO_INCREMENT 
, user_id INT NOT NULL 
--- other columns 
, CONSTRAINT Post_PK 
    PRIMARY KEY (user_id, post_id)  -- your clustered index 
, CONSTRAINT post_id_UQ 
    UNIQUE (post_id)    -- you still want uniqueness for the `post_id` 
) ENGINE = InnoDB ; 

चाहे यह एक अच्छा विचार है या नहीं, आपके आवेदन, डेटा वॉल्यूम्स और आपके प्रश्नों पर निर्भर करता है। सामान्य रूप से क्लस्टर कुंजी के सर्वोत्तम गुण अद्वितीय, संकीर्ण, स्थैतिक और हमेशा बढ़ते होते हैं। यही कारण है कि ऑटो-वृद्धि कॉलम सर्वश्रेष्ठ हैं। किम्बर्ली एल ट्रिप के ब्लॉग लेख में इसके बारे में पढ़ें: Ever-increasing clustering key - the Clustered Index Debate..........again! और The Clustered Index Debate Continues... (बंद नहीं करते क्योंकि वे एसक्यूएल-सर्वर के लिए कर रहे हैं, एक ही मुद्दों InnoDB के संकुल अनुक्रमण के लिए 99% लागू)

(user_id, post_id) की तरह एक संकुल कुंजी है पहले 3 गुण लेकिन यह हमेशा बढ़ता नहीं है। इसके परिणामस्वरूप सीआई के विखंडन और मेज में संभवतः धीमे सम्मिलन होंगे।

लेकिन यह अधिक कुशल पूछना चाहते हैं WHERE user_id = ? स्थितियों या सीमा की स्थिति वांछित डेटा के रूप में WHERE user_id BETWEEN ? AND ? या GROUP BY user_id समूहों एक ही स्थान पर और आवश्यक क्रम में क्लस्टर सूचकांक में मिल जाएगा का परिणाम देगा।

मेरा सुझाव है कि आप अपने मामले में सबसे अच्छा चुनने के लिए परीक्षण करें।


एक MySQL संस्करण, TokuDB भी है, जो एक तालिका में एकाधिक क्लस्टर इंडेक्स की अनुमति देता है।उनके लेख में विवरण: Introducing Multiple Clustering Indexes

1

मेरा सुझाव है कि आप गलत सवाल पूछ रहे हैं।

एक वैकल्पिक सवाल यह है कि "क्या मैं अपने वर्तमान PRIMARY KEY से छुटकारा पा सकता हूं ताकि मैं यह अन्य चीज़ 'क्लस्टर' कर सकूं?" अक्सर AUTO_INCREMENT को हटाया जा सकता है या एक सरल INDEX में बदल दिया जा सकता है।

अधिक संभावना प्रश्न है "इस SELECT ... के लिए इष्टतम अनुक्रमणिका क्या है?"। अन्य ने इंगित किया है कि दूसरा क्लस्टरर्ड इंडेक्स मूल MySQL के लिए प्रश्न से बाहर है, तो अगली पसंद क्या है? मैं SELECT जानने के बिना इसका उत्तर नहीं दे सकता। हालांकि my Index CookbookSELECTs के बड़े बचे के लिए प्रश्न का उत्तर देता है।