इसी तरह का सवाल पहले भी पूछा गया था
MySQL VARCHAR आकार के प्रदर्शन निहितार्थ
यहाँ मेरे जवाब का अंश है
आपको CHAR बनाम VARCHAR का उपयोग करने के tradeoffs का एहसास होना चाहिए
CHAR फ़ील्ड्स के साथ, जो आप आवंटित करते हैं, वही आपको मिलता है। उदाहरण के लिए, CHAR (15) 15 बाइट्स आवंटित करता है और संग्रहीत करता है, फिर चाहे आप फ़ील्ड में कितने भी अक्षर रखें। स्ट्रिंग हेरफेर सरल और सीधा है क्योंकि डेटा फ़ील्ड का आकार पूरी तरह से अनुमानित है।
VARCHAR क्षेत्रों के साथ, आपको एक पूरी तरह से अलग कहानी मिलती है। उदाहरण के लिए VARCHAR (15) वास्तव में गतिशील रूप से 16 बाइट्स तक, डेटा के लिए 15 तक और, कम से कम, 1 अतिरिक्त बाइट डेटा की लंबाई को संग्रहीत करने के लिए आवंटित करता है। यदि आपके पास स्टोर करने के लिए स्ट्रिंग 'हैलो' है जो 6 बाइट्स लेगा, तो 5. स्ट्रिंग हेरफेर को हमेशा सभी मामलों में लंबाई की जाँच के कुछ प्रकार का प्रदर्शन करना होगा।
जब आप दो काम करते हैं तो ट्रेडऑफ अधिक स्पष्ट होता है: 1. लाखों या अरबों पंक्तियों का संग्रह करना 2. उन स्तंभों को अनुक्रमणित करना जो या तो CHAR या VARCHAR हैं
TRADEOFF # 1 स्पष्ट रूप से, VARCHAR लाभ उठाता है क्योंकि चर-लंबाई डेटा छोटी पंक्तियों का उत्पादन करेगा और इस प्रकार, छोटी भौतिक फाइलें।
TRADEOFF # 2 चूंकि CHAR फ़ील्ड को निश्चित फ़ील्ड चौड़ाई के कारण कम स्ट्रिंग हेरफेर की आवश्यकता होती है, CHAR फ़ील्ड के विरुद्ध अनुक्रमणिका लुकअप औसत रूप से VARCHAR फ़ील्ड की तुलना में 20% अधिक तेज़ होता है। यह मेरी ओर से कोई अनुमान नहीं है। MySQL डेटाबेस डिजाइन और ट्यूनिंग पुस्तक ने इसे साबित करने के लिए एक MyISAM टेबल पर कुछ अद्भुत प्रदर्शन किया। पुस्तक में उदाहरण कुछ इस तरह था:
ALTER TABLE tblname ROW_FORMAT=FIXED;
यह निर्देश सभी VARCHAR को CHAR के रूप में व्यवहार करने के लिए मजबूर करता है। मैंने 2007 में अपनी पिछली नौकरी में ऐसा किया था और बिना किसी और बदलाव के 300GB टेबल ले लिया और 20% तक इंडेक्स लुकअप किया। यह प्रकाशित के रूप में काम किया। हालाँकि, इसने आकार में लगभग दोगुनी एक तालिका का निर्माण किया, लेकिन यह बस # 1 पर वापस जाती है।
आप यह देखने के लिए संग्रहीत डेटा का विश्लेषण कर सकते हैं कि MySQL कॉलम परिभाषा के लिए क्या सिफारिश करता है। बस किसी भी तालिका के खिलाफ निम्नलिखित चलाएँ:
SELECT * FROM tblname PROCEDURE ANALYSE();
यह संपूर्ण तालिका को आगे बढ़ाएगा और इसमें मौजूद डेटा, न्यूनतम फ़ील्ड मान, अधिकतम फ़ील्ड मान और इसके आगे के आधार पर प्रत्येक स्तंभ के लिए स्तंभ परिभाषाएँ सुझाएगा। कभी-कभी, आपको CHAR बनाम VARCHAR की योजना के साथ सामान्य ज्ञान का उपयोग करना होगा। यहाँ एक अच्छा उदाहरण है:
यदि आप IP पते स्टोर कर रहे हैं, तो ऐसे कॉलम के लिए मास्क अधिकतम 15 वर्णों (xxx.xxx.xxx.xxx) पर है। मैं CHAR(15)
दिल की धड़कन में सही कूद सकता हूं क्योंकि आईपी पते की लंबाई एक अतिरिक्त बाइट द्वारा नियंत्रित स्ट्रिंग हेरफेर की सभी और बहुत कुछ और अलग जटिलता नहीं होगी। आप अभी भी PROCEDURE ANALYSE()
इस तरह के एक स्तंभ के खिलाफ कर सकते हैं । यह VARCHAR की सिफारिश भी कर सकता है। इस उदाहरण में VARCHAR पर मेरा पैसा अभी भी CHAR पर होगा।
CHAR बनाम VARCHAR मुद्दों को उचित योजना के माध्यम से ही हल किया जा सकता है। महान शक्ति के साथ बड़ी जिम्मेदारी आती है (क्लिच लेकिन सच)।
अपडेट करें
जब एमडी 5 की बात आती है, strlen
तो संपूर्ण पंक्ति प्रारूप को स्विच करते समय आंतरिक रूप से गणना समाप्त की जानी चाहिए। क्षेत्र की परिभाषा को बदलने की कोई आवश्यकता नहीं होगी।
यदि MD5 कुंजी केवल VARCHAR मौजूद है, तो मैं इसके लिए जाऊंगा और तालिका पंक्ति प्रारूप को निर्धारित करूंगा । यदि अन्य VARCHAR क्षेत्रों के एक हस्ताक्षरित संख्या मौजूद है, तो वे भी लाभान्वित होंगे। बदले में, तालिका लगभग दो बार अपने आकार का विस्तार करेगी। लेकिन अतिरिक्त ट्यूनिंग के बिना प्रश्नों में लगभग 20% अधिक तेजी होनी चाहिए।