MySQL टेबल्स को शार्प करने के लिए सबसे अच्छा तरीका यह नहीं है जब तक कि यह करने के लिए पूरी तरह से अपरिहार्य न हो।
जब आप एक एप्लिकेशन लिख रहे होते हैं, तो आप आमतौर पर ऐसा करना चाहते हैं जो वेग, डेवलपर गति को अधिकतम करता है। आप विलंबता के लिए अनुकूलन करते हैं (उत्तर तैयार होने तक का समय) या केवल आवश्यक होने पर थ्रूपुट (प्रति समय उत्तर की संख्या)।
आप विभाजन करते हैं और फिर अलग-अलग होस्ट (= शार्द) में विभाजन असाइन करते हैं, जब इन सभी विभाजनों का योग अब एक डेटाबेस सर्वर उदाहरण पर फिट नहीं होता है - इसका कारण या तो लिखता है या पढ़ता है।
लिखने का मामला या तो एक है) लिखने की आवृत्ति इस सर्वर को स्थायी रूप से ओवरलोड कर रही है या बी) बहुत अधिक लिख रहे हैं ताकि प्रतिकृति स्थायी रूप से इस प्रतिकृति पदानुक्रम में पिछड़ जाए।
शार्डिंग के लिए रीड केस तब होता है जब डेटा का आकार इतना बड़ा होता है कि उसका कार्यशील सेट अब मेमोरी में फिट नहीं होता है और डेटा रीडिंग ज्यादातर समय मेमोरी से सेव किए जाने के बजाय डिस्क से टकराना शुरू कर देता है।
आप केवल जब है ठीकरा के लिए आप यह कर।
जिस क्षण आपने शार्प किया, आप उसके लिए कई तरीकों से भुगतान कर रहे हैं:
आपका अधिकांश SQL अब घोषित नहीं है।
आम तौर पर, SQL में आप डेटाबेस को बता रहे हैं कि आपको कौन सा डेटा चाहिए और उस विनिर्देश को डेटा एक्सेस प्रोग्राम में बदलने के लिए ऑप्टिमाइज़र पर छोड़ दें। यह एक अच्छी बात है, क्योंकि यह लचीला है, और क्योंकि इन डेटा एक्सेस प्रोग्राम को लिखना उबाऊ काम है जो वेग को नुकसान पहुँचाता है।
एक शार्प किए गए वातावरण के साथ आप शायद नोड B पर डेटा के विरुद्ध नोड A पर एक तालिका में शामिल हो रहे हैं, या आपके पास नोड A और B की तुलना में बड़ा नोड है, और नोड B और C पर डेटा के विरुद्ध डेटा से जुड़ रहे हैं। आप हल करने के लिए मैन्युअल रूप से एप्लिकेशन साइड हैश-आधारित जॉइन रिज़ॉल्यूशन लिखना शुरू कर रहे हैं (या आप MySQL क्लस्टर को फिर से मजबूत कर रहे हैं), जिसका अर्थ है कि आप बहुत अधिक एसक्यूएल के साथ समाप्त होते हैं जो अब घोषणात्मक नहीं है, लेकिन प्रक्रियात्मक तरीके से एसक्यूएल कार्यक्षमता व्यक्त कर रहा है। (जैसे आप लूप में SELECT स्टेटमेंट का उपयोग कर रहे हैं)।
आप नेटवर्क विलंबता को बहुत अधिक कर रहे हैं।
आम तौर पर, SQL क्वेरी को स्थानीय रूप से हल किया जा सकता है और ऑप्टिमाइज़र स्थानीय डिस्क एक्सेस से जुड़ी लागतों के बारे में जानता है और क्वेरी को इस तरह से हल करता है जो उसके लिए लागत को कम करता है।
एक शार्प किए गए वातावरण में, क्वेरीज़ को नेटवर्क पर कई नोड्स तक कुंजी-मान एक्सेस चलाकर हल किया जाता है (उम्मीद है कि बैच की गई एक्सेस के साथ और राउंड ट्रिप के लिए अलग-अलग कुंजी लुकअप न हों) या WHERE
क्लॉज़ के कुछ हिस्सों को आगे की ओर धकेलकर जहाँ वे कर सकते हैं लागू (जिसे 'कंडीशन पुशडाउन' कहा जाता है), या दोनों।
लेकिन सबसे अच्छे मामलों में भी इसमें कई और नेटवर्क राउंड ट्रिप शामिल हैं जो एक स्थानीय स्थिति है, और यह अधिक जटिल है। खासकर जब से MySQL अनुकूलक को नेटवर्क विलंबता के बारे में कुछ नहीं पता है (ठीक है, MySQL क्लस्टर धीरे-धीरे उस पर बेहतर हो रहा है, लेकिन क्लस्टर के बाहर वेनिला MySQL के लिए जो अभी भी सच है)।
आप SQL की बहुत अधिक अभिव्यंजक शक्ति खो रहे हैं।
ठीक है, यह शायद कम महत्वपूर्ण है, लेकिन विदेशी अखंडता और डेटा अखंडता के लिए अन्य एसक्यूएल तंत्र कई शार्कों को फैलाने में असमर्थ हैं।
MySQL में कोई API नहीं है जो अतुल्यकालिक प्रश्नों की अनुमति देता है जो कार्य क्रम में है।
जब एक ही प्रकार का डेटा कई नोड्स (उदाहरण के लिए नोड्स ए, बी और सी पर उपयोगकर्ता डेटा) पर रहता है, तो क्षैतिज प्रश्नों को अक्सर इन सभी नोड्स के खिलाफ हल करने की आवश्यकता होती है ("सभी उपयोगकर्ता खाते ढूंढें जो 90 दिनों से लॉग इन नहीं हुए हैं या ज्यादा")। डेटा एक्सेस टाइम नोड्स की संख्या के साथ रैखिक रूप से बढ़ता है, जब तक कि कई नोड्स समानांतर में नहीं पूछे जा सकते हैं और परिणाम ("मैप-रिड्यूस") के रूप में एकत्र होते हैं।
उस के लिए पूर्व शर्त एक अतुल्यकालिक संचार एपीआई है, जो एक अच्छे काम के आकार में MySQL के लिए मौजूद नहीं है। विकल्प बाल प्रक्रियाओं में बहुत अधिक फोर्किंग और कनेक्शन है, जो एक सीजन पास पर चूसना की दुनिया का दौरा कर रहा है।
एक बार जब आप शार्डिंग शुरू करते हैं, तो डेटा संरचना और नेटवर्क टोपोलॉजी आपके एप्लिकेशन के प्रदर्शन बिंदुओं के रूप में दिखाई देते हैं। यथोचित रूप से अच्छा प्रदर्शन करने के लिए, आपके एप्लिकेशन को इन चीजों के बारे में पता होना चाहिए, और इसका मतलब है कि वास्तव में केवल आवेदन स्तर का पैनापन समझ में आता है।
यह सवाल अधिक है कि क्या आप ऑटो-शार्क (यह निर्धारित करना चाहते हैं कि कौन सी पंक्ति उदाहरण के लिए हैशिंग प्राथमिक कुंजी द्वारा नोड में जाती है) या यदि आप मैन्युअल रूप से कार्यात्मक रूप से विभाजित करना चाहते हैं ("xyz उपयोगकर्ता कहानी से संबंधित तालिकाओं इस पर जाते हैं) मास्टर, जबकि एबीसी और डिफ संबंधित टेबल उस मास्टर के पास जाते हैं ")।
फ़ंक्शनल शार्किंग का यह फायदा है कि, अगर सही किया जाता है, तो यह अधिकांश डेवलपर्स के लिए अदृश्य होता है, क्योंकि उनकी उपयोगकर्ता कहानी से संबंधित सभी तालिकाएँ स्थानीय रूप से उपलब्ध होंगी। यह उन्हें तब तक घोषणात्मक एसक्यूएल के रूप में लंबे समय तक लाभ देने की अनुमति देता है, और कम नेटवर्क विलंबता को भी उकसाएगा क्योंकि क्रॉस-नेटवर्क ट्रांसफर की संख्या न्यूनतम रखी गई है।
फंक्शनल शार्किंग का नुकसान यह है कि यह किसी भी एक तालिका को एक से अधिक उदाहरण के लिए अनुमति नहीं देता है, और इसके लिए एक डिजाइनर के मैनुअल ध्यान की आवश्यकता होती है।
फ़ंक्शनल शार्पिंग का यह फायदा है कि यह किसी मौजूदा कोडबेस के साथ अपेक्षाकृत आसानी से हो जाता है जिसमें कई बदलाव नहीं होते हैं। http://Booking.com ने पिछले वर्षों में इसे कई बार किया है और इसने उनके लिए अच्छा काम किया है।
यह सब कहने के बाद, आपके प्रश्न को देखकर, मुझे विश्वास है कि आप गलत प्रश्न पूछ रहे हैं, या मैं आपके समस्या कथन को पूरी तरह से गलत समझ रहा हूं।