2012-12-07 61 views
14

जबकि गर्त खोज तो, मैं दो विरोधाभासी जवाब (और यहां तक ​​कि एक टिप्पणी है कि कहा गया है), लेकिन कोई निश्चित जवाब मिल गया है वहाँ किसी भी प्रदर्शन लाभ है, यदि आप एक पाठ/ब्लॉब क्षेत्र की दुकान एक टेबल के बाहर?स्टोर टेक्स्ट/बीएलओबी एक ही टेबल में या नहीं?</p> <p>समस्या है::

हम मानते हैं:

  • आप सही ढंग से चयन (केवल चयन पाठ/ब्लॉब यदि आवश्यक हो, कोई चुनें *)
  • टेबल्स समुचित रूप से सूचीबद्ध कर रहे हैं, जहां यह समझ में आता है (इसलिए यह 'की बात नहीं है यदि आप इसे अनुक्रमित करते हैं ')
  • डेटाबेस डिज़ाइन वास्तव में कोई फर्क नहीं पड़ता। यह कुछ विशेष डेटाबेस डिज़ाइन समस्याओं को हल करने के लिए, इस विशेष मामले में MySQL व्यवहार की पहचान करने का एक प्रश्न है। के
  • इंजन यह मान डाटाबेस केवल एक टेबल है (या दो, अगर पाठ/ब्लॉब अलग हो जाता है) करते हैं: InnoDB (दूसरों के भी दिलचस्प हो सकता है, अगर वे अलग परिणाम लाने)

यह पोस्ट स्टेटस, जो टेक्स्ट/बीएलओबी को एक अलग टेबल में डालते हैं, केवल तभी मदद करता है जब आप पहले से गलत तरीके से चयन कर रहे हैं (हमेशा आवश्यक नहीं होने पर भी टेक्स्ट/बीएलओबी चुनना) - मूल रूप से बताते हुए, उस टेक्स्ट/बीएलओबी में एक ही तालिका मूल रूप से बेहतर समाधान (कम जटिलता, कोई प्रदर्शन हिट इत्यादि नहीं है) क्योंकि टेक्स्ट/बीएलओबी को

पर अलग से संग्रहीत किया जाता है

टेक्स्ट कॉलम को किसी अन्य तालिका में ले जाने का एकमात्र समय किसी भी लाभ की पेशकश करेगा यदि आमतौर पर टेबल से सभी कॉलम चुनने की प्रवृत्ति होती है। यह केवल पहली बार क्षतिपूर्ति करने के लिए एक दूसरी बुरी आदत पेश कर रहा है। यह कहने के बिना जाना चाहिए कि दो गलत तीन lefts के समान नहीं है।

MySQL Table with TEXT column


इस पोस्ट में हालांकि, कहा गया है कि:

जब एक मेज पाठ या ब्लॉब स्तंभ होते हैं, टेबल स्मृति में संग्रहीत नहीं किया जा सकता

क्या इसका मतलब यह है कि प्रदर्शन के लिए एक टेबल के अंदर टेक्स्ट/बीएलओबी होना पर्याप्त है?

MySQL varchar(2000) vs text?


मेरे प्रश्न मूल रूप से है: सही जवाब क्या है?

क्या आप वाकई मायने रखते हैं कि यदि आप SELECT सही ढंग से टेक्स्ट/BLOB को एक अलग तालिका में संग्रहीत करते हैं?

या किसी तालिका के अंदर टेक्स्ट/BLOB भी है, तो एक संभावित प्रदर्शन हिट बनाएं?

+1

कोई विशिष्ट स्टोरेज इंजन जिसका आप उपयोग कर रहे हैं? InnoDB/MyISAM/NDB, आदि – gertvdijk

+0

@gertvdijk मैंने इसे जोड़ा - मुझे विशेष रूप से इनो डीबी के समाधान में दिलचस्पी है - लेकिन मूल रूप से, यदि कोई अंतर है, तो माईसाम और अन्य स्टोरेज इंजन भी दिलचस्प होंगे – Katai

उत्तर

12

अपने MySQL संस्करण पर उपलब्ध है, तो अपने MySQL विन्यास में InnoDB बाराकुडा फ़ाइल

innodb_file_format=barracuda 

का उपयोग कर प्रारूप का उपयोग करें और ROW_FORMAT=Dynamic (या Compressed) का उपयोग वास्तव में इसका इस्तेमाल करने के लिए अपने टेबल की स्थापना की।

यह इनओडीबी को पंक्ति पृष्ठों के बाहर बीएलओबी, टेक्स्ट और बड़े VARCHARs स्टोर करने के लिए बना देगा और इस प्रकार इसे और अधिक कुशल बना देगा। अधिक जानकारी के लिए this MySQLperformanceblog.com blog article देखें।

जहां तक ​​मैं इसे समझता हूं, बराक्यूडा प्रारूप का उपयोग करके टेक्स्ट टेबल/बीएलओबी/वर्चर्स को अलग-अलग तालिकाओं में संग्रहित करना होगा, जो प्रदर्शन कारणों से अब मान्य नहीं हैं। हालांकि, मुझे लगता है कि उचित डेटाबेस सामान्यीकरण को ध्यान में रखना हमेशा अच्छा होता है।

4

एक प्रदर्शन लाभ निश्चित लंबाई रिकॉर्ड के साथ एक टेबल है। इसका मतलब वर्चर या टेक्स्ट/ब्लॉब जैसे परिवर्तनीय लंबाई फ़ील्ड नहीं होगा। निश्चित लंबाई रिकॉर्ड के साथ, MySQL को रिकॉर्ड के अंत की "तलाश" करने की आवश्यकता नहीं है क्योंकि यह आकार ऑफ़सेट जानता है। यह भी जानता है कि एक्स रिकॉर्ड लोड करने के लिए उसे कितनी मेमोरी चाहिए। निश्चित लंबाई रिकॉर्ड वाले टेबल्स विखंडन से कम प्रवण होते हैं क्योंकि हटाए गए रिकॉर्ड से उपलब्ध स्थान को पूरी तरह से पुन: उपयोग किया जा सकता है। माईसाम टेबल में निश्चित रूप से निश्चित लंबाई रिकॉर्ड से कुछ अन्य लाभ होते हैं।

मान लीजिए कि आप innodb_file_per_table का उपयोग कर रहे हैं, एक अलग तालिका में टेक्स्ट/ब्लॉब रखने से संभावना है कि फ़ाइल सिस्टम कैशिंग का उपयोग किया जाएगा क्योंकि तालिका छोटी होगी।

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

आप "कच्चे फ़ाइल सिस्टम" का उपयोग करके डेटाबेस के बारे में नहीं सुनते हैं, भले ही यह बहुत तेज हो। "रॉ" तब होता है जब डेटाबेस किसी भी फाइल सिस्टम को छोड़कर डिस्क हार्डवेयर को सीधे एक्सेस करता है। मुझे लगता है कि ओरेकल अभी भी इसका समर्थन करता है। लेकिन यह अतिरिक्त जटिलता के लायक नहीं है, और आपको वास्तव में यह जानना होगा कि आप क्या कर रहे हैं। मेरी राय में, एक अलग तालिका में अपना टेक्स्ट/ब्लॉब संग्रहीत करना संभव प्रदर्शन लाभ के लिए अतिरिक्त जटिलता के लायक नहीं है। इसका लाभ उठाने के लिए आपको वास्तव में यह जानने की ज़रूरत है कि आप क्या कर रहे हैं, और आपके पहुंच पैटर्न।

+0

हाँ, लेकिन क्या करता है इसका मतलब है कि एक टेबल के लिए वास्तव में इसके अंदर एक टेक्स्ट है? यदि MySQL टेक्स्ट को बाहरी रूप से संग्रहीत करता है, तो मूल रूप से केवल उस बाहरी संग्रहण के लिए एक सूचक होना चाहिए, इसलिए यह टेक्स्ट को एक अलग तालिका में मैन्युअल रूप से संग्रहीत करने के समान होना चाहिए। यह मूल रूप से सवाल है, क्या यह पहले से ही स्वचालित रूप से होता है? (अलग भंडारण) जो मैं इसे खोजने की कोशिश कर रहा हूं, अगर यह बकवास है या नहीं, इसे मैन्युअल रूप से करने के लिए। टेक्स्ट को स्वचालित 'संदर्भ' कैसे संभाला जाता है? – Katai

+0

टेक्स्ट "बाहरी" को संग्रहीत MySQL के बीच एक अंतर है और एक अलग फ़ाइल में टेक्स्ट को बाहरी रूप से संग्रहीत करना है। MySQL फ़ाइल के भीतर इसे "बाहरी" संग्रहीत करता है, जैसे इंडेक्स और डेटा को उसी फ़ाइल में इनोडब के साथ संग्रहीत किया जाता है। यदि आप इसे एक अलग तालिका में संग्रहीत करते हैं, तो यह एक अलग फ़ाइल है। इसे मैन्युअल रूप से करने के लिए बकवास नहीं है, लेकिन आपको 1% प्रदर्शन बढ़ावा भी नहीं मिल रहा है। यह तब तक मापने योग्य नहीं होगा जब तक आपके पास लाखों रिकॉर्ड न हों। –