2011-07-14 16 views
7

मेरे पास एक MySQL डेटाबेस में आयात करने के लिए लगभग 28 मिलियन रिकॉर्ड हैं। रिकॉर्ड में अमेरिका के सदस्यों के बारे में व्यक्तिगत जानकारी है और राज्यों द्वारा खोजे जा सकेंगे।एक बड़ी mySql तालिका को छोटे में विभाजित करना - क्या यह इसके लायक है?

मेरा सवाल यह है कि, टेबल को एक बड़ी तालिका में रखने के विरोध में छोटी टेबलों में तालिका को तोड़ना अधिक कुशल है? मेरे मन में जो कुछ था, उन्हें 50 अलग-अलग राज्यों में विभाजित करना था जो 50 राज्यों का प्रतिनिधित्व करते थे: members_CA, members_AZ, members_TX, आदि;

इस तरह से मैं इस तरह एक प्रश्न कर सकता है:

'SELECT * FROM members_' . $_POST['state'] . ' WHERE members_name LIKE "John Doe" '; 

इस तरह से मैं केवल एक ही बार में किसी दिए गए राज्य के लिए डेटा से निपटने के लिए। सहजता से यह बहुत समझ में आता है लेकिन मैं अन्य राय सुनने के लिए उत्सुक होगा।

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

+1

तो, यदि आप सभी राज्यों में उपयोगकर्ता नाम खोजते हैं, तो आप 50 जोड़ों का उपयोग करेंगे? – Jacob

+8

आप कभी भी, जो वर्णन आपने नहीं किया है, कभी नहीं करना चाहते। इसे 1 टेबल में रखें, इसे 50 टेबल में कभी विभाजित न करें। विभाजन नामक कुछ है और MySQL आपको कुछ नियमों के अनुसार अपनी तालिका को विभाजित करने की अनुमति देता है। इसे खोजें और इसे वहां से ले जाएं, और कभी भी, एक विशेषता में कुछ अलग होने पर कभी भी एक अलग तालिका बनाने के बारे में सोचें। यह डरावना डीबी डिजाइन और बनाए रखने के लिए एक दुःस्वप्न है, अकेले उपयोग करते हैं। –

उत्तर

16

मैंने शुरुआत में एक टिप्पणी के रूप में पोस्ट किया लेकिन मैं अब एक उत्तर के रूप में पोस्ट करूंगा।

कभी भी, कभी भी विशेषता में अंतर के आधार पर एक्स टेबल बनाने के बारे में सोचें। ऐसा नहीं है कि चीजें कैसे की जाती हैं।

यदि आपकी तालिका में 28 मिलियन पंक्तियां होंगी, विभाजन को छोटे लॉजिकल सेट में विभाजित करने के बारे में सोचें।

आप MySQL documentation पर विभाजन के बारे में पढ़ सकते हैं।

दूसरी बात सही डीबी डिज़ाइन चुन रही है और आपकी अनुक्रमणिका को सही तरीके से चुन रही है।

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

अंतिम बात कार्य के लिए उपयुक्त हार्डवेयर चुन रही है, आप नहीं चाहते कि ऐसा ऐप 500 एमबी रैम या 1 गीगा रैम के साथ वीपीएस पर चल रहा हो।

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। – higgenkreuz

0

मेरी पहली प्रतिक्रिया यह है कि आपको सभी डेटा एक साथ रखने और इसे एक टेबल के रूप में रखने की आवश्यकता है। आपको प्रदर्शन बढ़ाने के लिए इंडेक्स को अपनी तालिका में डालना चाहिए, लेकिन इसे छोटे टेबल में तोड़ना नहीं चाहिए।

1

यदि आप राज्य कॉलम पर एक अनुक्रमणिका बनाते हैं तो एक राज्य के सभी सदस्यों पर एक चयन अलग-अलग तालिकाओं के उपयोग के रूप में उतना ही कुशल होगा। स्प्लिटिमग टेबल में बहुत सारे नुकसान हैं। यदि आप कॉलम जोड़ते हैं तो आपको उन्हें 50 टेबल में जोड़ना होगा। यदि आप विभिन्न राज्यों से डेटा चाहते हैं तो आपको यूनियन स्टेटमेंट्स का उपयोग करना होगा जो बहुत बदसूरत और अक्षम होंगे। मैं दृढ़ता से एक टेबल पर चिपकने की सलाह देते हैं।

2

ऐसा न करें। समान डेटा को 1 टेबल में ही रखें। जब निर्णय कई राज्यों में फैलता है तो आपको लॉजिकल फैसले और क्वेरी बनाने के लिए भारी समस्याएं होंगी। इसके अलावा यदि आपको कॉलम जोड़ने जैसे डेटाबेस परिभाषा को बदलने की आवश्यकता है, तो आपको सभी असंख्य (प्रतीत होता है अनंत) तालिकाओं पर एक ही ऑपरेशन करना होगा।

प्रदर्शन बढ़ाने के लिए अनुक्रमण का उपयोग करें लेकिन एकल तालिका से चिपके रहें !!!

प्रदर्शन हिट के लिए आप मेमोरी कैश भी बढ़ा सकते हैं। Follow this article to do so.

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