इस ब्लॉग पोस्ट में हम MySQL - विभाजन की सबसे व्यापक रूप से उपयोग की जाने वाली विशेषताओं में से एक पर चर्चा करने जा रहे हैं।
विभाजन क्या है?
MySQL में, विभाजन एक डेटाबेस डिज़ाइन तकनीक है जिसमें एक डेटाबेस डेटा को कई तालिकाओं में विभाजित करता है, लेकिन फिर भी SQL परत द्वारा डेटा को एकल तालिका के रूप में मानता है। सीधे शब्दों में कहें, जब आप किसी तालिका को विभाजित करते हैं, तो आप इसे कई उप-तालिकाओं में विभाजित करते हैं:विभाजन का उपयोग किया जाता है क्योंकि यह कुछ प्रश्नों के प्रदर्शन में सुधार करता है जिससे उन्हें डेटा के केवल एक हिस्से तक पहुंचने की अनुमति मिलती है जिससे वे तेज़ हो जाते हैं। I/O संचालन में भी सुधार किया जा सकता है क्योंकि डेटा और इंडेक्स को कई डिस्क वॉल्यूम में विभाजित किया जा सकता है।
विभाजन दो प्रकार के होते हैं:क्षैतिज और लंबवत। क्षैतिज विभाजन में अलग-अलग पंक्तियों को अलग-अलग तालिकाओं में रखना शामिल है, दूसरी ओर लंबवत विभाजन में कम स्तंभों वाली तालिकाएँ बनाना और शेष स्तंभों को संग्रहीत करने के लिए अतिरिक्त तालिकाओं का उपयोग करना शामिल है।
विभाजन कैसे कार्य करता है?
- जब SELECT क्वेरी का इस्तेमाल किया जाता है, तो पार्टिशनिंग लेयर खुल जाती है और पार्टिशन को लॉक कर देता है, क्वेरी ऑप्टिमाइज़र यह तय करता है कि क्या किसी भी पार्टिशन को काटा जा सकता है, फिर पार्टिशनिंग लेयर हैंडलर एपीआई कॉल को स्टोरेज इंजन को अग्रेषित करता है जो हैंडल करता है विभाजन।
- जब INSERT क्वेरी का उपयोग किया जाता है, तो विभाजन परत खुलती है और विभाजन को लॉक कर देती है, यह निर्धारित करती है कि पंक्ति किस विभाजन से संबंधित होनी चाहिए, फिर उस विभाजन को पंक्ति अग्रेषित करें।
- जब DELETE क्वेरी का उपयोग किया जाता है, तो विभाजन परत खुलती है और विभाजन को लॉक करती है, यह निर्धारित करती है कि किस विभाजन में पंक्ति है, फिर उस विभाजन से पंक्ति को हटा देता है।
- जब UPDATE क्वेरी का उपयोग किया जाता है, तो विभाजन परत खुल जाती है और विभाजन को लॉक कर देती है, यह पता लगाती है कि किस विभाजन में पंक्ति है, पंक्ति को प्राप्त करता है और इसे संशोधित करता है, फिर निर्धारित करता है कि किस विभाजन में नई पंक्ति होनी चाहिए, आगे की पंक्ति एक सम्मिलन अनुरोध के साथ नए विभाजन में, फिर मूल विभाजन को हटाने के अनुरोध को अग्रेषित करें।
आपको विभाजन का उपयोग कब करना चाहिए?
सामान्य तौर पर, विभाजन तब उपयोगी होता है जब:
- आपके पास बहुत सारा डेटा है जिसके माध्यम से आपको पूछताछ करने की आवश्यकता है।
- आपकी टेबल इतनी बड़ी हैं कि वे मेमोरी में फिट नहीं हो सकतीं।
- आपकी तालिकाओं में ऐतिहासिक डेटा होता है और नए डेटा को नवीनतम विभाजन में जोड़ा जाता है।
- आपको लगता है कि आपको टेबल की सामग्री को अलग-अलग स्टोरेज डिवाइस में बांटना होगा।
- आपको लगता है कि आपको अलग-अलग विभाजनों को पुनर्स्थापित करने की आवश्यकता होगी।
यदि ऊपर वर्णित एक या अधिक परिदृश्य आपकी स्थिति का वर्णन करते हैं, तो विभाजन मदद कर सकता है। हालांकि अपने डेटा को विभाजित करने से पहले, ध्यान रखें कि MySQL विभाजन की अपनी सीमाएं हैं:
- विभाजन अभिव्यक्ति संग्रहीत कार्यविधियों, संग्रहीत कार्यों, उपयोगकर्ता-परिभाषित कार्यों (UDFs) या प्लगइन्स, और SQL कार्यों के लिए सीमित समर्थन के उपयोग की अनुमति नहीं देती है। आप घोषित या संग्रहीत चर का भी उपयोग नहीं कर सकते।
- विभाजित तालिकाओं में विदेशी कुंजी शामिल नहीं हो सकती हैं या उनका संदर्भ नहीं दिया जा सकता है।
- प्रति तालिका 1,024 विभाजन की सीमा है (MariaDB 10.0.4 से शुरू होकर, तालिकाओं में अधिकतम 8,192 विभाजन हो सकते हैं)।
- तालिका को केवल तभी विभाजित किया जा सकता है जब भंडारण इंजन विभाजन का समर्थन करता है।
- क्वेरी कैश को विभाजन या विभाजन की छंटाई की जानकारी नहीं है।
- सभी विभाजनों को एक ही स्टोरेज इंजन का उपयोग करना चाहिए।
- पूर्ण टेक्स्ट अनुक्रमणिका समर्थित नहीं है
- अस्थायी तालिकाओं को विभाजित नहीं किया जा सकता
उपरोक्त विकल्पों से आपको यह तय करने में मदद मिलेगी कि विभाजन आपके लिए एक विकल्प है या नहीं।
विभाजन प्रकार
यदि आप विभाजन का उपयोग करने का निर्णय लेते हैं, तो ध्यान रखें कि आपके पास चुनने के लिए कई प्रकार के विभाजन हैं। हम नीचे आपके विकल्पों को संक्षेप में बताएंगे, फिर उनमें गहराई से उतरेंगे:
- RANGE के आधार पर विभाजन करने से आपको किसी दी गई सीमा में आने वाले स्तंभ मानों के आधार पर पंक्तियों को विभाजित करने में मदद मिल सकती है।
- LIST द्वारा विभाजन करने से आपको दी गई सूची में कॉलम मानों की सदस्यता के आधार पर पंक्तियों को विभाजित करने में मदद मिल सकती है।
- HASH द्वारा पार्टिशन करने से आपको यूजर-डिफ़ाइंड एक्सप्रेशन द्वारा दिए गए मान के आधार पर पंक्तियों को विभाजित करने में मदद मिल सकती है।
- KEY द्वारा विभाजन आपको MySQL द्वारा प्रदान किए गए हैशिंग फ़ंक्शन के आधार पर पंक्तियों को विभाजित करने में मदद कर सकता है।
RANGE द्वारा विभाजन
RANGE द्वारा विभाजन MySQL तालिकाओं को विभाजित करने के सबसे लोकप्रिय रूपों में से एक है। जब आप किसी तालिका को RANGE द्वारा विभाजित करते हैं, तो आप तालिका को इस प्रकार विभाजित करते हैं कि प्रत्येक विभाजन में एक निश्चित संख्या में पंक्तियाँ होती हैं जो किसी दी गई सीमा के भीतर आती हैं। एक विभाजन को परिभाषित करने के लिए, उसका नाम परिभाषित करें, फिर उसे बताएं कि उसे कौन से मान रखने चाहिए - एक तालिका को श्रेणी के आधार पर विभाजित करने के लिए, एक PARITION BY RANGE कथन जोड़ें। उदाहरण के लिए, यदि आप अपने विभाजन को p0 नाम देना चाहते हैं और इसे 5 से कम के प्रत्येक मान को रखना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि आपकी क्वेरी में PARTITION p0 VALUES LESS THAN (5) है। यहाँ एक विभाजित तालिका का उदाहरण दिया गया है:
CREATE TABLE sample_table (
id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,
column_name VARCHAR(255) NOT NULL DEFAULT ‘’
...
) PARTITION BY RANGE (column_name) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (20),
...
);
आप एक ऐसे विभाजन को भी परिभाषित कर सकते हैं जिसमें वे सभी मान हों जो कुछ निश्चित श्रेणियों में नहीं आते जैसे:
PARTITION p5 VALUES LESS THAN MAXVALUE
उपरोक्त विभाजन को p5 नाम दिया गया है और इसमें वे सभी मान हैं जो अन्य विभाजन नहीं रखते हैं - MAXVALUE एक मान का प्रतिनिधित्व करता है जो हमेशा सबसे बड़े संभावित मान से अधिक होता है। आप अपने विभाजनों को इस प्रकार परिभाषित करके भी कार्यों का उपयोग कर सकते हैं:
PARTITION BY RANGE (YEAR(date)) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN (2020),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
इस मामले में, 2000 से कम के सभी मान पार्टीशन p0 में संग्रहीत किए जाते हैं, 2010 से कम के सभी मान पार्टीशन p1 में संग्रहीत किए जाते हैं, सभी मान जो 2020 से कम हैं, में संग्रहीत हैं विभाजन p2 और सभी मान जो इनमें से किसी भी श्रेणी में नहीं आते हैं, विभाजन p3 में संग्रहीत किए जाते हैं।
सूची के अनुसार विभाजन
LIST द्वारा MySQL तालिकाओं का विभाजन RANGE द्वारा विभाजन के समान है - LIST द्वारा विभाजन तालिका का मुख्य अंतर यह है कि जब तालिकाओं को LIST द्वारा विभाजित किया जाता है तो प्रत्येक विभाजन को कॉलम मान की सदस्यता के आधार पर परिभाषित और चुना जाता है मूल्यों की एक श्रृंखला के बजाय मूल्य सूचियों के एक समूह में। LIST द्वारा विभाजन उपयोगी हो सकता है जब आप जानते हैं कि, उदाहरण के लिए, आपके पास डेटा है जिसे डेटा के कई छोटे सेट (जैसे, क्षेत्र) में विभाजित किया जा सकता है। मान लीजिए कि आपके पास एक स्टोर है जिसमें 4 फ्रेंचाइजी हैं:एक शहर के मध्य भाग में, दूसरा उत्तर में, तीसरा पूर्व में, चौथा पश्चिम में। आप एक टेबल को इस तरह से विभाजित कर सकते हैं कि एक निश्चित फ़्रैंचाइज़ी से संबंधित डेटा उस फ़्रैंचाइज़ी को समर्पित विभाजन में संग्रहीत किया जाएगा:
PARTITION BY LIST(store) (
PARTITION central VALUES IN (1,3,5),
PARTITION north VALUES IN (2,4,7),
PARTITION east VALUES IN (8,9),
PARTITION west VALUES IN (10,11)
);
HASH द्वारा विभाजन
HASH द्वारा MySQL तालिकाओं का विभाजन यह सुनिश्चित करने का एक तरीका हो सकता है कि सभी विभाजनों में डेटा समान रूप से वितरित किया जाता है। यदि आप अपनी तालिकाओं को HASH द्वारा विभाजित कर रहे हैं, तो आपको केवल यह निर्दिष्ट करने की आवश्यकता है कि आपको अपने डेटा को कितने विभाजनों में विभाजित करने की आवश्यकता है - शेष MySQL का ध्यान रखा जाता है। आप तालिका बनाने के लिए निम्नलिखित कथन जोड़कर HASH द्वारा विभाजन का उपयोग कर सकते हैं:
PARTITION BY HASH(id)
PARTITIONS 5;
5 को उस संख्या से बदलें जो निर्दिष्ट करती है कि आपको अपने डेटा को कितने विभाजनों में विभाजित करने की आवश्यकता है - डिफ़ॉल्ट संख्या 1 है।
MySQL भी LINEAR HASH द्वारा विभाजन का समर्थन करता है - लीनियर हैशिंग नियमित हैशिंग से भिन्न होता है क्योंकि लीनियर हैशिंग एक लीनियर पॉवर-ऑफ-टू एल्गोरिथम का उपयोग करता है। तालिकाओं को LINEAR HASH द्वारा विभाजित करने के लिए, PARTITION BY HASH को PARTITION BY LINEAR HASH से बदलें।
कुंजी द्वारा विभाजन
कुंजी द्वारा MySQL तालिकाओं को विभाजित करना HASH द्वारा MySQL तालिकाओं को विभाजित करने के समान है - इस मामले में, कुंजी विभाजन के लिए हैशिंग फ़ंक्शन MySQL सर्वर द्वारा आपूर्ति की जाती है। विभाजन कुंजी के रूप में उपयोग किए जाने वाले किसी भी कॉलम में संपूर्ण तालिका की प्राथमिक कुंजी शामिल होनी चाहिए या कम से कम तालिका की प्राथमिक कुंजी का हिस्सा होना चाहिए। यदि विभाजन कुंजी के रूप में कोई कॉलम नाम निर्दिष्ट नहीं है, तो प्राथमिक कुंजी का उपयोग किया जाएगा। यदि कोई प्राथमिक कुंजी नहीं है, लेकिन एक अद्वितीय कुंजी है, तो इसके बजाय अद्वितीय कुंजी का उपयोग किया जाएगा। उदाहरण के लिए, निम्नलिखित कथन दोनों मान्य हैं, भले ही पहला कथन विभाजन कुंजी को भी निर्दिष्ट नहीं करता है:
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;
निष्कर्ष
संक्षेप में, विभाजन सहायक हो सकते हैं यदि आपके पास बहुत अधिक डेटा है, आपकी तालिकाएँ स्मृति में फ़िट होने के लिए बहुत बड़ी हैं या उनमें ऐतिहासिक डेटा है। विभाजन भी उपयोगी हो सकते हैं यदि आपको लगता है कि आपको तालिका की सामग्री को विभिन्न भंडारण माध्यमों में वितरित करने की आवश्यकता होगी, भले ही आप अलग-अलग विभाजनों को हटाने या पुनर्स्थापित करने का विकल्प चाहते हों।
हालाँकि, ध्यान रखें कि MySQL में विभाजन के अपने नुकसान हैं। विभाजन के प्रमुख नुकसानों में से एक यह है कि यह आपकी तालिकाओं को बड़ा कर देगा - आप अंतरिक्ष से समझौता किए बिना गति प्राप्त नहीं कर सकते। यदि आपके पास डेटा का एक बहुत बड़ा सेट है तो यह एक बहुत बड़ी समस्या हो सकती है।