2009-12-04 14 views
5

के साथ MySQL तालिका मैं डेटाबेस पर काम कर रहा हूं और मुझे एक टेक्स्ट फ़ील्ड से निपटना होगा।टेक्स्ट कॉलम

अब, मेरा मानना ​​है कि मैंने कुछ जगह देखी है, यह तालिका के बाकी हिस्सों से टेक्स्ट कॉलम को अलग करना सर्वोत्तम होगा (इसे स्वयं की एक तालिका में डालना)।

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

कुछ शोध से पता चला this हुए यह कहा कि

अलग पाठ/मेटाडाटा से धब्बे, परिणामों में पाठ/धब्बे डाल नहीं करता है, तो आप उन्हें जरूरत नहीं है।

हालांकि, मैं "मेटाडेटा" की परिभाषा इस्तेमाल किया जा रहा से परिचित नहीं हूँ।

तो मुझे आश्चर्य है कि किसी तालिका में टेक्स्ट कॉलम डालने में कोई प्रासंगिक फायदे हैं या नहीं। बाकी क्षेत्रों के साथ होने की संभावित समस्याएं क्या हैं? और इसे अलग तालिका में रखने की संभावित समस्याएं?

यह तालिका (टेक्स्ट फ़ील्ड के बिना) को अक्सर खोजा जाना चाहिए (चयनित)। क्या "समयपूर्व अनुकूलन बुराई माना जाता है" यहां महत्वपूर्ण है? (यदि टेक्स्ट कॉलम में वास्तव में जुर्माना है, कैसे प्रासंगिक है, क्योंकि यह आवश्यक होने पर बाद में इसे बदलने में काफी आसान है)।

इसके अलावा, क्या इस विषय पर कोई अच्छा लिंक है? (शायद स्टैक ओवरफ्लो प्रश्न & उत्तर? मैंने इस विषय को खोजने की कोशिश की है, लेकिन मुझे केवल टेक्स्ट बनाम वर्चर चर्चाएं मिलीं)

उत्तर

6

हाँ, ऐसा लगता है कि आपने वाक्य के अर्थ का गलत व्याख्या किया है। यह क्या कहता है कि आपको केवल एक फ़ील्ड फ़ील्ड समेत एक चयन करना चाहिए यदि आपको वास्तव में उस क्षेत्र की सामग्री की आवश्यकता है। ऐसा इसलिए है क्योंकि टेक्स्ट/बीएलओबी कॉलम में बड़ी मात्रा में डेटा हो सकता है जिसे आपके आवेदन में वितरित करने की आवश्यकता होगी - इसमें समय और पाठ्यक्रम संसाधन होते हैं।

शुभकामनाएं, फैबियन

1

वहाँ कुछ अच्छे कारणों अपनी मेज परिभाषा से बाहर एक पाठ क्षेत्र को अलग करने के हो सकता है। उदाहरण के लिए, यदि आप एक ओआरएम का उपयोग कर रहे हैं जो पूर्ण रिकॉर्ड लोड करता है, इससे कोई फर्क नहीं पड़ता कि आप टेक्स्ट फ़ील्ड को पकड़ने के लिए एक प्रॉपर्टी टेबल बनाना चाहते हैं, इसलिए यह हर समय लोड नहीं होता है। हालांकि यदि आप सादगी के लिए 100% कोड को नियंत्रित कर रहे हैं, तो टेबल पर फ़ील्ड छोड़ दें, फिर केवल तभी चुनें जब आपको डेटा ट्रैशर और रीडिंग टाइम पर कटौती करने की आवश्यकता हो।

+1

मैं नहीं बल्कि उत्पाद गलत व्यवहारों का उपयोग करता है खाई होगी।हालांकि, अगर आप इसे रखना चाहते हैं, और आप सीधे अपनी चयन सूची को नियंत्रित नहीं कर सकते हैं, तो आप इसे हमेशा एक दृश्य दे सकते हैं। –

1

चिंता यह है कि 8,192 बाइट्स से अधिक बड़े टेक्स्ट फ़ील्ड की तरह-अत्यधिक अनियमित क्षेत्रों पर जटिल प्रश्नों के दौरान अत्यधिक पेजिंग और/या फ़ाइल I/o का कारण बन जाएगा। ऐसे मामलों में, बड़े क्षेत्र को किसी अन्य तालिका में माइग्रेट करना और इसे नई तालिका की पंक्ति आईडी या इंडेक्स (जो तब metadata होगा) के साथ बदलना बेहतर होगा क्योंकि इसमें वास्तव में डेटा नहीं है)।

नुकसान कर रहे हैं: एक) अधिक जटिल स्कीमा ख) बड़े क्षेत्र का निरीक्षण किया उपयोग कर रही है या लिया गया, कोई लाभ ग) डेटा स्थिरता सुनिश्चित करना अधिक जटिल है और डेटाबेस अस्वस्थता का एक संभावित स्रोत है।

+1

** बिलकुल नहीं! ** टेक्स्ट डेटा वास्तविक डेटा के समान पृष्ठों में संग्रहीत नहीं है। जब आप अपना टेक्स्ट डेटा पुनर्प्राप्त करना चाहते हैं तो अपने टेक्स्ट फ़ील्ड को दूसरी तालिका में ले जाकर आप सभी _gain_ अतिरिक्त ओवरहेड्स हैं। –

5

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

सामान्यीकृत सरल स्कीमा से शुरू करें, फिर जब कुछ धीमा साबित होता है तो केवल जटिलता जोड़ें जहां/यदि आवश्यक हो।

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

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

मूल रूप से, इंटरनेट पर प्राप्त होने वाली किसी भी MySQL ट्यूनिंग सलाह लेने से पहले कुछ डेटा प्राप्त करें!

3

टेक्स्ट कॉलम के लिए डेटा पहले ही अलग से संग्रहीत है। जब भी आप टेक्स्ट कॉलम वाले तालिका से SELECT *, परिणाम-सेट में प्रत्येक पंक्ति को टेक्स्ट संग्रहण क्षेत्र में एक लुकअप की आवश्यकता होती है। यह बड़ी मात्रा में डेटा की वास्तविक संभावना के साथ आपके सिस्टम के लिए एक बड़ा ओवरहेड होगा।

कॉलम को किसी अन्य तालिका में स्थानांतरित करने के लिए बस एक अतिरिक्त लुकअप की आवश्यकता होती है, एक द्वितीयक तालिका में, और सामान्य टेक्स्ट टेक्स्ट स्टोरेज क्षेत्र में।

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

+0

हाय वहाँ :) मैं भी ओपी के सवाल का सही जवाब खोजने की कोशिश कर रहा हूं, आपका जवाब मुझे समझ में आता है। हालांकि, मुझे इस प्रश्न के उत्तर में विरोधाभासी जानकारी मिली है: http://stackoverflow.com/questions/5053658/mysql-varchar2000-vs-text - इस पर आपके विचार क्या हैं? किसी की मदद के लिए अग्रिम धन्यवाद। – Mike

1

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

आप शायद इस देखा, MySQL मैनुअल http://dev.mysql.com/doc/refman/5.5/en/optimize-character.html

एक मेज जैसे नाम और पते के रूप में स्ट्रिंग कॉलम शामिल हैं से है, लेकिन कई प्रश्नों उन स्तंभों को पुनः प्राप्त नहीं करते हैं, में स्ट्रिंग कॉलम बंटवारे पर विचार एक अलग मेज और आवश्यक होने पर एक विदेशी कुंजी के साथ प्रश्न पूछने का उपयोग कर। जब MySQL किसी पंक्ति से किसी भी मान को पुनर्प्राप्त करता है, तो वह उस डेटा ब्लॉक को पढ़ता है जिसमें उस पंक्ति के सभी कॉलम होते हैं (और संभवतः अन्य आसन्न पंक्तियां)। प्रत्येक पंक्ति को छोटा रखना, केवल सबसे अधिक उपयोग किए जाने वाले कॉलम के साथ, प्रत्येक डेटा ब्लॉक में अधिक पंक्तियों को फिट करने की अनुमति देता है। ऐसी कॉम्पैक्ट टेबल सामान्य प्रश्नों के लिए डिस्क I/O और स्मृति उपयोग को कम करती हैं।

कौन वास्तव में आप कह रहा है कि MySQL में आप पाठ डेटा रखने से (और ब्लॉब, के रूप में कहीं और लिखित) तालिकाओं में हतोत्साहित किया जाता है अक्सर खोजा

संबंधित मुद्दे