जैसा कि @ ओलाफ वर्णन करता है, इनो डीबी चुनता है कि कौन सा कॉलम या कॉलम संयोजन क्लस्टर्ड इंडेक्स होगा (प्राथमिक कुंजी, या प्राथमिक कुंजी अगर कोई प्राथमिक कुंजी नहीं है, या छुपा कॉलम यदि दो में से कोई भी नहीं है)।
आप संकुल अनुक्रमणिका के रूप में एक गैर-अद्वितीय स्तंभ करना चाहते हैं, तो आप एक अद्वितीय कुंजी के रूप में 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
स्रोत
2012-12-08 17:45:38