आपको अधिकांश स्थितियों में चार कॉलम के रूप में और उसी तरह से लंबाई निर्धारित करने की कोशिश करनी चाहिए, जिस तरह से आप एक वर्गाकार स्तंभ देख सकते हैं। आपको हमेशा var modifier के बारे में इतना नहीं सोचना चाहिए कि कुछ ऐसा हो जो आपके निर्णय लेने की अधिकतम लंबाई पर असर डालता हो। इसे वास्तव में एक प्रदर्शन संकेत के रूप में देखा जाना चाहिए बजाय इसके कि आपूर्ति किए गए तार अलग-अलग लंबाई के होंगे।
यह एक निर्देश नहीं है जिसे डेटाबेस इंटर्न द्वारा सख्ती से पालन किया जाना है, इसे पूरी तरह से अनदेखा किया जा सकता है। हालांकि इस बात का ध्यान रखें कि कभी-कभी कार्यान्वयन लीक हो सकता है (उदाहरण के लिए निश्चित लंबाई और पैडिंग) भले ही यह एक आदर्श दुनिया में नहीं होना चाहिए।
यदि आपके पास एक varchar (255) है, तो आपके पास कोई गारंटी नहीं है कि प्रदर्शन वार यह हमेशा किसी भी परिस्थिति में चार (255) के लिए किसी भी अलग तरह से व्यवहार करने वाला है।
भंडारण की आवश्यकताओं के बारे में मैनुअल में दी गई सलाह से इसे 255, 65535 आदि जैसे कुछ पर सेट करना आसान लग सकता है। इससे यह आभास होता है कि 0 (हाँ, यह एक बात है) और 255 के बीच के किसी भी मूल्य का समान प्रभाव होगा। हालांकि यह ऐसी चीज नहीं है जिसकी पूरी गारंटी हो।
भंडारण आवश्यकताएं सही होती हैं या पंक्ति भंडारण के संदर्भ में सभ्य और परिपक्व स्थिर भंडारण इंजन के लिए एक अच्छा संकेतक होती हैं। यह इंडेक्स जैसी चीजों के लिए मजबूत संकेतक नहीं है।
यह कभी-कभी एक मुश्किल सवाल है, ठीक कितनी देर तक स्ट्रिंग का एक टुकड़ा होना चाहिए ताकि इसे उच्चतम सीमा तक स्थापित किया जा सके आपको पता है कि यह भीतर होना चाहिए लेकिन इसका कोई प्रभाव नहीं है। दुर्भाग्य से यह अक्सर उपयोगकर्ता को काम करने के लिए छोड़ दिया जाता है और यह वास्तव में कुछ हद तक मनमाना है। आप वास्तव में यह नहीं कह सकते कि कभी भी एक स्ट्रिंग की देखरेख न करें क्योंकि हो सकता है कि ऐसे मामले हों जहाँ आप बिल्कुल निश्चित नहीं हैं।
आपको यह सुनिश्चित करना चाहिए कि MySQL क्वेरीज एक एरर फेंकती है जब एक स्ट्रिंग ट्रंकट के बजाय बहुत लंबी होती है ताकि कम से कम आपको पता चले कि क्या यह एरर उत्सर्जन से बहुत कम हो सकता है। कॉलम को बड़ा या छोटा करने के लिए उनका आकार बदलना एक महंगा डीडीएल ऑपरेशन हो सकता है, इसे ध्यान में रखा जाना चाहिए।
चरित्र सेट पर भी विचार किया जाना चाहिए जहां लंबाई और प्रदर्शन खेलने में आता है। लंबाई बाइट्स के बजाय इसे संदर्भित करता है। यदि उदाहरण के लिए utf8 का उपयोग कर रहे हैं, (MB4 नहीं) तो varchar (255) वास्तव में varbinary (3 * 255) है। यह जानना मुश्किल है कि परीक्षण चलाने और स्रोत कोड / दस्तावेज को गहराई से देखे बिना इस तरह की चीजें वास्तव में कैसे खेलेंगी। इस वजह से अत्यधिक लंबाई के लिए अप्रत्याशित रूप से फुलाया प्रभाव पड़ने की गुंजाइश है। यह केवल प्रदर्शन पर लागू नहीं होता है। यदि आपको एक दिन एक वैरिकाज़ कॉलम के वर्ण सेट को एक बड़े से बदलने की आवश्यकता है, तो हो सकता है कि अगर आप कृतज्ञतापूर्वक लंबे तार मौजूद होने से बचा सकते हैं, तो आप बिना किसी संभोग के कुछ सीमा तक रोक सकते हैं। यह आम तौर पर एक काफी आला समस्या है, लेकिन यह सामने आता है,
यदि यह पता चला कि MAX (LENGTH (स्तंभ)) हमेशा <64 है (जैसे कि अगर यह निर्णय लिया गया था कि इनपुट पर एक सीमा होगी जो स्तंभ परिभाषा से मेल नहीं खाती थी) लेकिन आपके पास varchar (255) है तो एक है अच्छा मौका है कि आप कुछ परिदृश्यों में आवश्यकता से चार गुना अधिक स्थान का उपयोग करेंगे।
इसमें शामिल हो सकते हैं:
- विभिन्न इंजन, कुछ इसे पूरी तरह से अनदेखा कर सकते हैं।
- बफ़र आकार, उदाहरण के लिए अद्यतन या सम्मिलित करने के लिए पूर्ण 255 आवंटित करना पड़ सकता है (हालांकि मैंने इसे साबित करने के लिए स्रोत कोड की जांच नहीं की है, यह केवल एक काल्पनिक है)।
- अनुक्रमित, यह तुरंत स्पष्ट हो जाएगा यदि आप बहुत सारे वर्चर (255) कॉलम से एक संयुक्त कुंजी बनाने की कोशिश करते हैं।
- इंटरमीडिएट टेबल और संभवतः परिणाम सेट। लेन-देन के काम करने के तरीके को देखते हुए, यह हमेशा संभव नहीं हो सकता है कि परिभाषित सीमा के विपरीत किसी कॉलम में वास्तविक अधिकतम लंबाई का उपयोग करना।
- आंतरिक भविष्य कहनेवाला अनुकूलन एक इनपुट के रूप में अधिकतम लंबाई ले सकता है।
- डेटाबेस कार्यान्वयन संस्करणों में परिवर्तन।
अंगूठे के एक नियम के रूप में वास्तव में एक varchar की आवश्यकता नहीं होती है क्योंकि इसे वैसे भी होने की आवश्यकता होती है, प्रदर्शन के मुद्दे या नहीं इसलिए मैं आपको उस समय चिपके रहने की सलाह देता हूं जब आप कर सकते हैं। अपने डेटा के आकार का नमूना लेने के लिए अधिक प्रयास करना, एक वास्तविक सीमा लागू करना या पूछना / शोध के माध्यम से सही सीमा का पता लगाना आदर्श दृष्टिकोण है।
जब आप ऐसा नहीं कर सकते हैं, यदि आप संदेह के समय मामलों के लिए कुछ ऐसा करते हैं जैसे कि varchar (255) तो मैं विज्ञान करने की सलाह देता हूं। इसमें तालिका को डुप्लिकेट करना शामिल हो सकता है, var char कॉलम के आकार को कम करना और फिर उसमें डेटा को मूल से कॉपी करना और अनुक्रमणिका / पंक्ति डेटा के आकार को देखना (स्तंभ को भी अनुक्रमणित करना), इसे भी एक प्राथमिक कुंजी के रूप में आज़माएं पंक्तियों को प्राथमिक कुंजी द्वारा आदेशित किए जाने के कारण इनोबीडी में अलग तरह से व्यवहार किया जा सकता है)। बहुत कम से कम इस तरह से आपको पता चल जाएगा कि क्या आपके पास आईओ पर प्रभाव पड़ता है जो सबसे संवेदनशील बाधाओं में से एक है। मेमोरी के उपयोग के लिए परीक्षण करना अधिक कठिन है, यह कठिन रूप से परीक्षण करना मुश्किल है। मैं संभावित सबसे खराब मामलों की जांच करने की सलाह दूंगा (स्मृति परिणामों में बहुत सारे मध्यवर्ती के साथ प्रश्न, बड़े अस्थायी तालिकाओं के लिए व्याख्या के साथ जांच, आदि)।
यदि आप जानते हैं कि तालिका में बहुत सी पंक्तियाँ नहीं हैं, तो आप जॉइन, इंडेक्स (विशेष रूप से कंपोज़िट, यूनिक) आदि के लिए कॉलम का उपयोग नहीं करने जा रहे हैं, तो आपको सबसे अधिक समस्या नहीं होगी।
VARCHAR(255) utf8mb4
~ 150k पंक्तियों के साथ एकल अनुक्रमित स्तंभ के साथ एक तालिका 11.5MB मापा जाता है।VARCHAR(48) utf8mb4
समान डेटा (अधिकतम लंबाई 46 वर्ण) के साथ एक अनुक्रमित स्तंभ के साथ एक तालिका का उपयोग 4.5 एमबी। प्रश्नों में वास्तव में एक बड़ा अंतर नहीं है, यह अनुक्रमित है। लेकिन इसमें क्वेरी I / O और डेटाबेस बैकअप जैसी चीजें शामिल हैं।