MySQL विभाजन: प्रत्येक विभाजन के विभाजन और आकार के बीच एक प्रदर्शन व्यापार है?


10

मेरे पास एक बड़ी तालिका (कई 100 मिलियन पंक्तियाँ) हैं जिन्हें मैं कुशलतापूर्वक विभाजन करना चाहूंगा। मेरा सवाल है कि क्या विभाजन आकार और विभाजन की संख्या के बीच एक व्यापार है। जहां तक ​​मैं समझता हूं, विभाजन में उपयोग किए गए एक कॉलम पर अधिकांश क्वेरीज़ तेज़ होंगी क्योंकि क्वेरी (अधिकांश क्वेरीज़ के लिए) केवल क्वेरी पर लागू विभाजन के भीतर खोजना होगी। इस प्रकार, यह समझ में आता है कि, दक्षता को अधिकतम करने के लिए, आपको बड़ी तालिका को विभाजन की अधिकतम संख्या में विभाजित करना चाहिए, इसलिए, प्रत्येक विभाजन को जितना संभव हो उतना छोटा बना सकते हैं। MySQL के मामले में, इसका मतलब 1024 विभाजन है। लेकिन क्या बड़ी संख्या में विभाजन के लिए कोई प्रदर्शन दोष है? क्या ऐसा है, किसी को विभाजन की अधिकतम संख्या कैसे मिलती है?

नोट: स्टैकओवरफ्लो पर पहले से ही कुछ समान प्रश्न है , लेकिन केवल एक उत्तर है, जो (मेरे दृष्टिकोण से) निशान को याद करता है। इसलिए मैं प्रश्न को अपने तरीके से बताऊंगा ... उम्मीद है कि यह अधिक स्पष्ट है

जवाबों:


6

आइए उनकी तुलना करते हैं

विभाजित आकार

यदि आपके पास निम्नलिखित हैं:

  • एक तालिका में 100 मिलियन पंक्तियाँ
  • BTREE अनुक्रमण
  • BTREE में प्रत्येक पृष्ठ में 1024 कुंजियाँ हैं

मीट्रिक कैसा दिखेगा?

चूंकि लॉग (100000000) / लॉग (2) = 26.575424759099, बीटीआरई सूचकांक 1024 कुंजी प्रति पृष्ठ ट्रीनोड में केवल 3 की पेड़ की ऊंचाई होगी (CEILING (लॉग (100000000) / लॉग) (1024))। केवल तीन पृष्ठों के नोड्स के साथ, प्रत्येक एक्सेस किए गए ट्रीनोड में आवश्यक कुंजी के लिए एक द्विआधारी खोज के परिणामस्वरूप लगभग 30 कुंजियों को छंटाई और अलग किया जाएगा।

विभाजन की संख्या

यदि आपके पास निम्नलिखित हैं:

  • एक तालिका में 100 मिलियन पंक्तियाँ
  • BTREE अनुक्रमण
  • BTREE में प्रत्येक पृष्ठ में 1024 कुंजियाँ हैं
  • आप 1024 परिमाण बनाते हैं

संख्या थोड़ी भिन्न होगी।

प्रत्येक विभाजन में लगभग 97656 पंक्तियाँ होनी चाहिए। अब मेट्रिक्स क्या बनेंगे?

चूंकि लॉग (97656) / लॉग (2) = 16.575421065795, बीटीआरई सूचकांक 1024 कुंजी प्रति पृष्ठ टरिनोड के साथ केवल 2 की पेड़ की ऊंचाई होगी (CEILING (लॉग (97656) / लॉग) (1024))। केवल दो पृष्ठों के नोड्स के साथ, प्रत्येक एक्सेस किए गए ट्रीनोड में आवश्यक कुंजी के लिए एक द्विआधारी खोज के परिणामस्वरूप लगभग 20 कुंजियों को छंटाई और अलग किया जाएगा।

निष्कर्ष

चाबियों को फैलाने से सिर्फ एक पेड़ का स्तर निकल जाता है, लेकिन अनिवार्य रूप से 1024 सूचकांक बनाता है। प्रश्नों में अंतर नहीं पता चलेगा। विभाजन के पक्ष में खोज का समय संभवतः नाममात्र होगा। हालाँकि, सुनिश्चित करें कि सभी डेटा सक्रिय है। अन्य, आप केवल कुछ विभाजन मार सकते हैं, जबकि शायद ही कभी एक्सेस किए गए डेटा के साथ अन्य विभाजन केवल स्थान लेते हैं और विभाजन को सही ठहराने के लिए कभी-कभी पर्याप्त रूप से एक्सेस नहीं किए जाते हैं । इस बारे में चिंता करने के लिए आपके पास अलग-अलग प्रदर्शन मीट्रिक हो सकते हैं, जो अधिक धुंधला हैं (जैसे कि XFS में आंतरिक डीफ़्रैग्मेंटेशन , ext3 बनाम ext4, आदि) आपको यह भी चिंता करने की आवश्यकता है कि आप किस संग्रहण इंजन का उपयोग कर रहे हैं क्योंकि:

  • माईस्टैम की तुलना में इनोबीडी इंडेक्सिंग थोड़ा गड़बड़ हो जाएगा क्योंकि एक क्लस्टर इंडेक्स को प्रबंधित करने के लिए
  • InnoDB ibdata1 के साथ-साथ वर्तमान लॉग फ़ाइल (ib_logfile0 या ib_logfile1) में डेटा का दोहरा लेखन करता है

1
धन्यवाद, RolandoMySQLDBA, यह बहुत दिलचस्प है। इससे मैं जो समझता हूं, वह यह है कि विभाजन की गति पर क्वेरी गति पर एक छोटा लेकिन प्रशंसनीय सकारात्मक प्रभाव पड़ेगा, लेकिन विखंडन जैसे अन्य नकारात्मक प्रभाव हो सकते हैं। हालांकि, मुझे क्या दिलचस्पी है, विभाजन के इष्टतम संख्या का निर्धारण कैसे करें। क्या मुझे हमेशा अधिकतम स्वीकार्य संख्या (यानी 1024) का उपयोग करना चाहिए, या कुछ अन्य संख्या सकारात्मक और नकारात्मक प्रभावों के बीच एक अच्छा समझौता हो सकती है? या इस तरह के अनुकूलन का विश्लेषण करना संभव नहीं है?
रोबगिननेस

BTW, यह लेख बताता है कि उत्तर थोड़ा और अधिक जटिल है: mysqlperformanceblog.com/2010/12/11/…
robguinness

उत्तर अच्छा है, लेकिन यह कुंजी (या अनुक्रमित क्षेत्र) द्वारा खोज के बारे में है। मुझे विभाजन के साथ कोई बहुत अधिक अनुभव नहीं है, लेकिन मेरे विचार से यह तब उपयोगी होता है जब आपको पूर्ण टैबल स्कैन करना होता है। ऐसे मामले में आप पूरी तालिका के बजाय केवल कई विभाजन स्कैन करते हैं।
चेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.