2012-08-01 20 views
7

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

मैं इसे कैसे कर सकता हूं? निश्चित रूप से मेरे पास मेरे आईडी कॉलम पर प्राथमिक कुंजी है और मेरी आईडी अद्वितीय है। प्रत्येक श्रेणी में अद्वितीय नहीं है।

हालांकि विभाजन में यह सीमा है कि "तालिका पर प्रत्येक अद्वितीय कुंजी को तालिका की विभाजन अभिव्यक्ति में प्रत्येक कॉलम का उपयोग करना चाहिए"।

ठीक है, क्या यह विभाजन को थोड़ा बेकार नहीं बनाता है? या क्या मैं कुछ न कुछ भूल रहा हूं? मुझे क्या करना चाहिए?

http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

उत्तर

10

चाल अपने वर्तमान प्राथमिक कुंजी के लिए क्षेत्र category जोड़ना है। (आपकी प्राथमिक कुंजी प्राथमिक कुंजी रहेगी)
फिर आप श्रेणी के आधार पर अपनी तालिका को विभाजित कर सकते हैं।

ALTER TABLE `products` DROP PRIMARY KEY , ADD PRIMARY KEY (`id` , `category`); 
ALTER TABLE `products` PARTITION BY KEY(category) PARTITIONS 6; 

आईडी पर auto_increment विकल्प जोड़ें यदि आप यह वास्तव में अद्वितीय होना चाहता हूँ, और जब आप तालिका में डेटा सम्मिलित आईडी मान निर्दिष्ट नहीं करते हैं:

यहाँ कोड आप का उपयोग कर सकते है। आईडी प्रविष्टि पर डेटाबेस सर्वर द्वारा निर्धारित किया जाएगा।

यदि आवश्यक हो तो फ़ील्ड के नाम और कुंजी नाम बदलें।

प्रलेखन:
Partitioning types
KEY Partioning

+0

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

+0

नहीं। प्राथमिक कुंजी में कोई फ़ील्ड जोड़ना इसे गैर-अनन्य नहीं बना सकता है, जैसा कि मैंने अपने उत्तर में लिखा है। आप कोशिश क्यों नहीं करते और देखते हैं कि यह काम करता है? मैंने दिन में विभाजन के लिए एक बड़ी लॉग तालिका (2 और 5 मिलियन रिकॉर्ड के बीच) पर विभाजन का उपयोग किया है: यह दिन में बहुत तेजी से 'चयन' की अनुमति देता है, और किसी विशेष दिन के लिए सभी रिकॉर्डों का तेज़ी से हटाना (केवल विभाजन को छोड़कर))। – Jocelyn

+0

ओह नहीं, मुझे पता है कि प्राथमिक कुंजी अभी भी अद्वितीय होगी। लेकिन आईडी जो अब केवल कुंजी का हिस्सा होगी, श्रेणी कॉलम में अलग-अलग मूल्य के रूप में अनूठी होने से रोक सकती है, हालांकि यह अद्वितीय होगा हालांकि आईडी समान होगी। लेकिन ऐसा लगता है कि MySQL बस इस तरह काम करता है (हालांकि यह ज्यादा समझ में नहीं आता है) और मुझे इसके साथ रहना होगा। वैसे भी, आपके प्रयास के लिए धन्यवाद। –

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