2008-11-27 12 views
10

मैं एक रेल एप्लिकेशन बनाने की सोच रहा हूं जिसमें कुछ सुंदर 500 मिलियन पंक्तियों के साथ बड़ी तालिकाएं होंगी। चीजों को खुश रखने के लिए मैं वर्तमान में देख रहा हूं कि एक बड़ी तालिका को प्रबंधनीय हिस्सों में कैसे विभाजित किया जा सकता है। मैं देखता हूं कि MySQL 5.1 के रूप में एक विभाजन विकल्प है और यह एक संभावित विकल्प है, लेकिन मुझे कॉलम कॉलम पसंद नहीं है जो निर्धारित करता है कि विभाजन को तालिका पर प्राथमिक कुंजी का हिस्सा होना चाहिए।बड़ी डीबी टेबल से निपटने के लिए रणनीति

मैं वास्तव में क्या करने के लिए मेज है कि एक एआर मॉडल पर मूल्यों लिखा लेकिन जहाँ तक मैं वाकिफ हूँ कोई रास्ता नहीं यह करने के लिए है आधारित करने के लिए लिखते हैं विभाजित है करना चाहते हैं क्या - किसी रूप में किसी भी सुझाव है मैं कैसे या किसी वैकल्पिक रणनीति को कार्यान्वित कर सकता हूं?

धन्यवाद

Arfon

MySQL में

उत्तर

5

विभाजन कॉलम प्राथमिक कुंजी तक सीमित नहीं हैं। वास्तव में, एक विभाजन कॉलम को बिल्कुल महत्वपूर्ण नहीं होना चाहिए (हालांकि इसके लिए एक पारदर्शी रूप से बनाया जाएगा)। आप रेंज, हैश, कुंजी और लिस्ट द्वारा विभाजित कर सकते हैं (जो केवल रेंज के समान है कि यह अलग-अलग मानों का एक सेट है)। विभाजन प्रकारों के an overview के लिए MySQL मैन्युअल पढ़ें।

वैकल्पिक समाधान जैसे HScale - एक मिडलवेयर प्लग-इन है जो पारदर्शी रूप से कुछ मानदंडों के आधार पर विभाजन तालिकाओं को विभाजित करता है। HiveDB MySQL के लिए क्षैतिज विभाजन के लिए एक ओपन-सोर्स फ्रेमवर्क है।

शेडिंग और पार्टियनिंग के अलावा आपको कुछ प्रकार के क्लस्टरिंग को नियोजित करना चाहिए। सबसे सरल सेटअप एक प्रतिकृति आधारित सेटअप है जो आपको कई भौतिक सर्वरों पर लोड फैलाने में मदद करता है। आपको MySQL क्लस्टर (शायद आपके डेटाबेस के आकार के कारण कोई विकल्प नहीं) और Sequioa जैसे क्लस्टरिंग मिडलवेयर जैसे अधिक उन्नत क्लस्टरिंग समाधानों पर विचार करना चाहिए।

मैंने वास्तव में कुछ समय पहले स्टैक-ओवरफ्लो पर scaling with MySQL से संबंधित एक प्रासंगिक प्रश्न पूछा था, जिसे मैंने विषय पर बहुत सारी जानकारी इकट्ठा करने के बाद कई दिनों बाद जवाब देने का अंत किया। आपके लिए भी प्रासंगिक हो सकता है।

1

यदि आप समय के साथ अपने डेटा को विभाजित करना चाहते हैं, तो निम्न समाधान आपकी आवश्यकता के अनुरूप हो सकता है। आप शायद MERGE टेबल का उपयोग कर सकते हैं;

की अपनी मेज मान लेते हैं MyTable कहा जाता है और आप प्रति सप्ताह एक मेज की जरूरत है कि

  1. आपके ऐप ने हमेशा एक ही मेज
  2. एक साप्ताहिक काम atomically अपनी मेज का नाम बदलता में लॉग करता है और एक खाली एक पुन: MyTable का नाम बदलकर मायटेबल-ईयर-वीकनंबर रखा गया है, और एक नया खाली मायटेबल बनाया गया है
  3. मर्ज टेबल को गिरा दिया गया है और फिर से बनाया गया है।

यदि आप पिछले तीन महीनों के सभी डेटा प्राप्त करना चाहते हैं, तो आप एक विलय तालिका बनाते हैं जिसमें पिछले 3 महीनों में केवल तालिकाएं शामिल होंगी। अलग-अलग अवधियों की आवश्यकता के रूप में कई मर्ज टेबल बनाएं।आप तालिका जिसमें datas वर्तमान में डाला जाता है (हमारे उदाहरण में MyTable) शामिल नहींकर सकते हैं, आप और भी अधिक खुशी होगी, आप किसी भी पढ़ें/लिखें संगामिति

1

आप इस पूरी तरह से संभाल कर सकते हैं की जरूरत नहीं होगी के रूप में DataFabric का उपयोग कर सक्रिय रिकॉर्ड में।

यदि यह उपयुक्त नहीं है तो यह समान व्यवहार को लागू करने के लिए जटिल नहीं है। ऐप टियर के भीतर तालिका विभाजन को संभालने के स्थापत्य पैटर्न पर बहुत सी चर्चा के लिए Google sharding। इसमें मिडलवेयर से बचने या डीबी वेंडर विशिष्ट विशेषताओं के आधार पर लाभ हैं। दूसरी तरफ यह आपके ऐप में अधिक कोड है कि आप इसके लिए ज़िम्मेदार हैं।

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