MySQL अनुरक्षण अनुक्रमण करता है


12

मैंने विखंडन को रोकने और किसी तरह कुछ प्रश्नों के निष्पादन को अनुकूलित करने के लिए MySQL में अनुक्रमणिका को बनाए रखने के तरीके के बारे में बहुत शोध किया।

मैं उस सूत्र से परिचित हूं जो एक तालिका के लिए उपलब्ध अधिकतम स्थान के बीच अनुपात की गणना करता है। डेटा और अनुक्रमित द्वारा उपयोग किए जाने वाले स्थान।

हालाँकि मेरे मुख्य प्रश्न अभी भी अनुत्तरित हैं। शायद यह इस तथ्य के कारण है कि मैं एसक्यूएल सर्वर में सूचकांक रखरखाव से परिचित हूं, और मुझे लगता है कि MySQL में यह किसी भी तरह समान होना चाहिए।

SQL सर्वर में, आपके पास कई अनुक्रमणिकाएँ हो सकती हैं, और इसमें से प्रत्येक में विखंडन के विभिन्न स्तर हो सकते हैं। फिर आप किसी एक को उठा सकते हैं और बाकी को प्रभावित किए बिना उस विशेष सूचकांक में 'REORGANIZE' या 'REBUILD' ऑपरेशन कर सकते हैं।

मेरे ज्ञान का सबसे अच्छा करने के लिए, इस तरह के रूप में कोई 'टेबल विखंडन' नहीं है, और SQL सर्वर 'टेबल विखंडन' को ठीक करने के लिए कोई उपकरण प्रदान नहीं करता है। यह क्या प्रदान करता है, सूचकांक विखंडन की जांच करने के लिए उपकरण हैं (एक सूचकांक वीएस द्वारा उपयोग किए गए पृष्ठों की संख्या के बीच का अनुपात समझा जाता है, उस पृष्ठ और संदर्भ की पूर्णता), साथ ही आंतरिक और बाहरी विखंडन।

यह सब समझने में काफी सरल है, कम से कम मेरे लिए।

अब, जब MySQL में अनुक्रमणिका को बनाए रखने की बारी आती है, तो केवल 'तालिका विखंडन' की अवधारणा मौजूद है, जैसा कि ऊपर बताया गया है।

MySQL की एक तालिका में कई सूचकांक हो सकते हैं, लेकिन जब मैं उस प्रसिद्ध सूत्र के साथ 'विखंडन अनुपात' की जांच करता हूं, तो मुझे प्रत्येक सूचकांक का विखंडन दिखाई नहीं देता है, लेकिन संपूर्ण रूप में तालिका।

जब मैं MySQL में अनुक्रमणिका का अनुकूलन करना चाहता हूं, तो मैं (SQL सर्वर में) पर काम करने के लिए एक विशेष सूचकांक नहीं चुनता हूं। इसके बजाय, मैं पूरी तालिका में एक 'ऑप्टिमाइज़' ऑपरेशन करता हूं, जो संभवतः सभी इंडेक्स को प्रभावित करता है।

जब तालिका MySQL में अनुकूलित होती है, तो डेटा + इंडेक्स वीएस द्वारा उपयोग किए जाने वाले स्थान के बीच का अनुपात कुल स्थान कम हो जाता है, जो हार्ड ड्राइव में कुछ प्रकार के भौतिक पुन: संगठन का सुझाव देता है, जो भौतिक स्थान की कमी में बदल जाता है। हालांकि, सूचकांक विखंडन केवल भौतिक स्थान के बारे में नहीं है, लेकिन आवेषण और अपडेट के कारण उस पेड़ की संरचना को समय के साथ बदल दिया गया है।

अंत में, मुझे InnoDB / MySQL में एक तालिका मिली। उस तालिका में 3 मिलियन रिकॉर्ड, 105 कॉलम और 55 इंडेक्स हैं। यह इंडेक्स को छोड़कर 1.5GB है, जो 2.1GB है।

अद्यतन करने, प्रविष्टि (हम वास्तव में रिकॉर्ड नहीं हटाते हैं) के लिए उस तालिका को कभी-कभी हजारों बार मारा जा रहा है।

उस सारणी को बने हुए कई साल हो गए हैं और मुझे पता है कि कोई भी अनुक्रमणिका बनाए नहीं रख सकता है।

मैं वहाँ एक विशाल विखंडन को खोजने की उम्मीद कर रहा था, लेकिन जब मैं विखंडन गणना निर्धारित के रूप में करता हूं

free_space / (data_length + index_length)

यह पता चला है कि मेरे पास केवल 0.2% विखंडन है। IMHO जो काफी अवास्तविक है।

तो बड़े सवाल हैं:

  1. मैं MySQL में किसी विशेष इंडेक्स के विखंडन की जांच कैसे करूं, संपूर्ण तालिका के रूप में नहीं
  2. क्या OPTIMIZE TABLE वास्तव में SQL सर्वर में किसी इंडेक्स के आंतरिक / बाहरी विखंडन को ठीक करता है?
  3. जब मैं MySQL में एक टेबल को ऑप्टिमाइज़ करता हूं, तो क्या यह वास्तव में टेबल पर सभी इंडेक्सों का पुनर्निर्माण करता है?
  4. क्या यह सोचना यथार्थवादी है कि किसी इंडेक्स के भौतिक स्थान को कम करना (स्वयं पेड़ को बनाए बिना) वास्तव में बेहतर प्रदर्शन में बदल जाता है?

अनुकूलन तालिका निश्चित रूप से InnoDB पर संकुल अनुक्रमणिका को साफ

1
यह एक महान सवाल है, बस एक प्रोग्रामिंग नहीं है। जहां यह है, वहां ले जाया जाएगा:>

जवाबों:


6

सूचकांक विखंडन बहुत अधिक है। इसकी चिंता न करें।

दो आसन्न, कुछ हद तक खाली, ब्लॉकों को प्राकृतिक प्रसंस्करण के रूप में इनोबीडी द्वारा एक साथ मिलाया जाता है।

बीट्री पर बेतरतीब कार्रवाई से यह स्वाभाविक रूप से औसतन 69% पूर्ण की ओर बढ़ता है। ज़रूर, यह 100% नहीं है, लेकिन "फिक्सिंग" का ओवरहेड इसके लायक नहीं है।

SHOW TABLE STATUS आपको कुछ मैट्रिक्स देता है, लेकिन वे त्रुटिपूर्ण हैं - "Data_free" में कुछ निश्चित "मुक्त" स्थान शामिल हैं, लेकिन अन्य "मुक्त" स्थान नहीं है।

प्रत्येक ब्लॉक में अप्रयुक्त स्थान है; मुक्त 16KB ब्लॉक; मुक्त "extents" (nMB चंक्स); MVCC पंक्तियों का इंतजार किया जा रहा है; गैर-पत्ती नोड्स का अपना विखंडन है; आदि।

एक अनुक्रमणिका कितनी बड़ी (ब्लॉक की संख्या) है, यह देखने के लिए पेरकोना और ओरेकल के अलग-अलग तरीके हैं। मुझे लगता है कि उनमें से कोई भी "मुक्त" की सीमित परिभाषा के कारण उपयोगी नहीं है। ऐसा लगता है कि ब्लॉक (16 केबी प्रत्येक) को विखंडन (कई एमबी) में आवंटित किया जाता है, जिससे एक को विश्वास हो सकता है कि सभी प्रकार के विखंडन हैं। वास्तव में, यह आमतौर पर इन मल्टी-एमबी चंक में से एक है। और OPTIMIZE TABLEजरूरी नहीं कि अंतरिक्ष में से किसी को फिर से तैयार किया जाए।

यदि SQL सर्वर BTrees का उपयोग कर रहा है, तो यह कहने के लिए झूठ है कि "कोई विखंडन नहीं है"। "ब्लॉक विभाजन" पर क्या होता है, इसके बारे में सोचें। या लगातार डीफ्रैगमेंटिंग के ओवरहेड के बारे में सोचें। किसी भी तरह से आप खो देते हैं।

आगे ध्यान दें कि एक तालिका और एक सूचकांक अनिवार्य रूप से समान संरचनाएं हैं:

  • बी + ट्री, कुछ सूचकांक पर आधारित है
  • "डेटा" प्राथमिक कुंजी पर आधारित है; प्रत्येक माध्यमिक सूचकांक अपने सूचकांक के आधार पर एक B + ट्री है।
  • "डेटा" के पत्ती नोड में तालिका के सभी कॉलम होते हैं।
  • एक द्वितीयक सूचकांक के पत्ती नोड में उस द्वितीयक सूचकांक के कॉलम होते हैं, साथ ही प्राथमिक कुंजी के कॉलम होते हैं।

यदि आपके पास है innodb_file_per_table = ON, तो आप .ibdफ़ाइल के आकार को देखकर OPTIMIZE TABLE के बाद स्पष्ट रूप से सिकुड़न (यदि कोई हो) देख सकते हैं । के लिए OFF, जानकारी को दफन कर दिया गया है ibdata1, लेकिन SHOW TABLE STATUSयथोचित रूप से सटीक हो सकता है क्योंकि सभी "मुक्त" स्थान हर तालिका के हैं। अच्छी तरह से, पूर्व-आवंटित चूजों को छोड़कर।

आप देख सकते हैं कि एक ताज़ा अनुकूलित फ़ाइल-प्रति-तालिका तालिका में 4M, 5M, 6M या DataMfree का 7M है। फिर, यह पूर्व-आवंटन है, और आपको मिनट का विवरण देने में विफलता है।

मैंने एक दशक से अधिक समय तक InnoDB के साथ काम किया है; मैंने हजारों विभिन्न तालिकाओं के साथ काम किया है, बड़े और छोटे। मैं कहता हूं कि एक हजार में केवल एक टेबल की वास्तव में जरूरत है OPTIMIZE TABLE। अन्य तालिकाओं पर इसका उपयोग करना बेकार है।

105 कॉलम बहुत हैं, लेकिन शायद बहुत सारे नहीं हैं।

क्या आपके पास एक टेबल पर 55 इंडेक्स हैं ? वह बुरा है। यानी 55 अपडेट प्रति INSERT। आइए आगे चर्चा करें। ध्यान रखें कि INDEX(a)अगर आपके पास भी बेकार है INDEX(a,b)। और INDEX(flag)कम हृदयता के कारण बेकार है। (लेकिन INDEX(flag, foo)उपयोगी हो सकता है।)

Q1: डेटा या द्वितीयक अनुक्रमित दोनों में विखंडन के सभी रूपों की जांच करने का कोई अच्छा तरीका नहीं है।

क्यू 2, क्यू 3: एक नई तालिका और सभी पंक्तियों OPTIMIZE TABLEद्वारा तालिका का पुनर्निर्माण करता है , फिर और । पीके ऑर्डर में डेटा को फिर से डालने का आश्वासन दिया गया है कि डेटा अच्छी तरह से डीफ़्रेग्मेंटेड है। सूचकांक एक और मामला है।CREATEingINSERTingRENAMEingDROPping

Q4: आप कर सकता है DROP और reCREATEप्रत्येक सूचकांक इसे स्वच्छ करें करने के लिए। लेकिन यह बेहद धीमी प्रक्रिया है। 5.6 में कुछ स्पीडअप हैं, लेकिन मुझे नहीं पता कि वे डीफ़्रैग्मेन्टेशन में मदद करते हैं या नहीं।

यह भी संभव है ALTER TABLE ... DISABLE KEYS, फिर ENABLEउन्हें। यह एक ही बार में सभी माध्यमिक अनुक्रमितों के अधिक कुशल पुनर्निर्माण के लिए हो सकता है।


रिक, मेरा मतलब था '105' फ़ील्ड्स, फाइलें नहीं
निकोलस

1

मैं MySQL में किसी विशेष इंडेक्स के विखंडन की जांच कैसे करूं, संपूर्ण तालिका के रूप में नहीं

उत्तीर्ण करना।

क्या OPTIMIZE TABLE वास्तव में SQL सर्वर में किसी इंडेक्स के आंतरिक / बाहरी विखंडन को ठीक करता है?

यह पूरी तरह से तालिका और उसके अनुक्रमों का पुनर्निर्माण करता है।

जब मैं MySQL में एक टेबल को ऑप्टिमाइज़ करता हूं, तो क्या यह वास्तव में टेबल पर सभी इंडेक्सों का पुनर्निर्माण करता है?

यही सवाल उसी जवाब के साथ है।

क्या यह सोचना यथार्थवादी है कि किसी इंडेक्स के भौतिक स्थान को कम करना (स्वयं पेड़ को बनाए बिना) वास्तव में बेहतर प्रदर्शन में बदल जाता है?

यह सोचकर यथार्थवादी नहीं है कि आप पेड़ के पुनर्निर्माण के बिना अंतरिक्ष को कम कर सकते हैं । वे साथ-साथ चलते हैं।


# 1 का जवाब देने के लिए: हालांकि यह बहुत सटीक नहीं है, लेकिन कॉलम SHOW TABLE STATUS LIKE 'mytable'में संकेत देगा data freedev.mysql.com/doc/refman/5.6/en/show-table-status.html
जेहाद केरिकी

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