क्या varchar size के बीच MySQL में प्रदर्शन अंतर है? उदाहरण के लिए, varchar(25)
और varchar(64000)
। यदि नहीं, तो क्या यह सुनिश्चित करने का एक कारण है कि सभी वर्चरों को अधिकतम आकार के साथ घोषित नहीं किया जाए ताकि आप कमरे से बाहर न भाग सकें?
क्या varchar size के बीच MySQL में प्रदर्शन अंतर है? उदाहरण के लिए, varchar(25)
और varchar(64000)
। यदि नहीं, तो क्या यह सुनिश्चित करने का एक कारण है कि सभी वर्चरों को अधिकतम आकार के साथ घोषित नहीं किया जाए ताकि आप कमरे से बाहर न भाग सकें?
जवाबों:
आपको CHAR बनाम VARCHAR का उपयोग करने के tradeoffs का एहसास होना चाहिए
CHAR फ़ील्ड्स के साथ, जो आप आवंटित करते हैं, वही आपको मिलता है। उदाहरण के लिए, CHAR (15) 15 बाइट्स आवंटित करता है और संग्रहीत करता है, फिर चाहे आप फ़ील्ड में कितने भी अक्षर रखें। स्ट्रिंग हेरफेर सरल और सीधा है क्योंकि डेटा फ़ील्ड का आकार पूरी तरह से अनुमानित है।
VARCHAR क्षेत्रों के साथ, आपको एक पूरी तरह से अलग कहानी मिलती है। उदाहरण के लिए VARCHAR (15) वास्तव में गतिशील रूप से 16 बाइट्स तक आवंटित करता है, डेटा के लिए 15 तक और, कम से कम, 1 अतिरिक्त बाइट डेटा की लंबाई को संग्रहीत करने के लिए। यदि आपके पास स्टोर करने के लिए स्ट्रिंग 'हैलो' है जो 6 बाइट्स लेगा, तो 5. स्ट्रिंग हेरफेर को हमेशा सभी मामलों में लंबाई की जाँच के कुछ प्रकार का प्रदर्शन करना होगा।
जब आप दो काम करते
हैं तो ट्रेडऑफ अधिक स्पष्ट होता है:
1. लाखों या अरबों पंक्तियों का संग्रह करना
2. उन स्तंभों को अनुक्रमणित करना जो या तो CHAR या VARCHAR हैं
जाहिर है, VARCHAR लाभ उठाता है क्योंकि चर-लंबाई डेटा छोटी पंक्तियों का उत्पादन करेगा और इस प्रकार, छोटी भौतिक फाइलें।
चूंकि CHAR फ़ील्ड्स को निश्चित फ़ील्ड चौड़ाई के कारण कम स्ट्रिंग हेरफेर की आवश्यकता होती है, CHAR फ़ील्ड के विरुद्ध अनुक्रमणिका लुकअप औसत रूप से VARCHAR फ़ील्ड्स की तुलना में 20% अधिक तेज़ी से होता है। यह मेरी ओर से कोई अनुमान नहीं है। MySQL डेटाबेस डिजाइन और ट्यूनिंग पुस्तक ने इसे साबित करने के लिए एक MyISAM टेबल पर कुछ अद्भुत प्रदर्शन किया। पुस्तक में उदाहरण कुछ इस तरह था:
ALTER TABLE tblname ROW_FORMAT=FIXED;
यह निर्देश बल वाराह के रूप में व्यवहार करने के लिए हैं। मैंने 2007 में अपनी पिछली नौकरी में ऐसा किया था और बिना किसी और बदलाव के 300GB टेबल ले लिया और 20% तक इंडेक्स लुकअप किया। यह प्रकाशित के रूप में काम किया। हालाँकि, इसने लगभग एक टेबल का आकार लगभग दोगुना कर दिया, लेकिन यह केवल # 1 ट्रेडऑफ़ पर वापस जाता है।
आप यह देखने के लिए संग्रहीत डेटा का विश्लेषण कर सकते हैं कि MySQL कॉलम परिभाषा के लिए क्या सिफारिश करता है। बस किसी भी तालिका के खिलाफ निम्नलिखित चलाएँ:
SELECT * FROM tblname PROCEDURE ANALYSE();
यह संपूर्ण तालिका को आगे बढ़ाएगा और इसमें मौजूद डेटा, न्यूनतम फ़ील्ड मान, अधिकतम फ़ील्ड मान और इसके आगे के आधार पर प्रत्येक स्तंभ के लिए स्तंभ परिभाषाएँ सुझाएगा। कभी-कभी, आपको CHAR बनाम VARCHAR की योजना बनाने के साथ सामान्य ज्ञान का उपयोग करना होगा। यहाँ एक अच्छा उदाहरण है:
यदि आप IP पते स्टोर कर रहे हैं, तो ऐसे कॉलम के लिए मास्क अधिकतम 15 वर्णों (xxx.xxx.xxx.xxx) पर है। मैं दिल की धड़कन में CHAR (15) पर सही तरीके से कूदूंगा क्योंकि आईपी पते की लंबाई एक अतिरिक्त बाइट द्वारा नियंत्रित स्ट्रिंग हेरफेर की सभी और बहुत कुछ और अलग जटिलता नहीं होगी। आप इस तरह के कॉलम के खिलाफ अभी भी एक प्रक्रिया विश्लेषण () कर सकते हैं। यह VARCHAR की सिफारिश भी कर सकता है। मेरा पैसा अभी भी इस उदाहरण में VARCHAR पर CHAR पर होगा।
CHAR बनाम VARCHAR मुद्दों को उचित योजना के माध्यम से ही हल किया जा सकता है। बड़ी ताकत के साथ बड़ी जिम्मेदारी आती है (क्लिच लेकिन सच)
इसका उत्तर वास्तव में जटिल है। संक्षिप्त संस्करण: एक अंतर है ।
परिणामों (जैसे GROUP BY
कथन) को फ़िल्टर करने के लिए अस्थायी टेबल बनाते समय , पूरी लंबाई आवंटित की जाएगी।
वायर प्रोटोकॉल (क्लाइंट को पंक्तियाँ भेजना) संभवतः बड़ी लंबाई आवंटित करेगा।
भंडारण इंजन एक उचित varchar लागू नहीं कर सकता / सकती है।
(2) मैं मानता हूं कि वायर प्रोटोकॉल कुछ ऐसा नहीं है जिससे मैं पूरी तरह परिचित हूं, लेकिन यहां सामान्य सलाह है कि लंबाई का अनुमान लगाने के लिए कम से कम कुछ न्यूनतम प्रयास लागू करें।
इस सूत्र में अधिकांश उत्तर 5 साल पुराने हैं, जो पहले InnoDB और utf8 में लिखे गए थे, चूक थे। तो, मुझे शुरू करने दो ...
जब किसी क्वेरी को आंतरिक अस्थायी तालिका की आवश्यकता होती है तो वह तालिका का उपयोग करने की कोशिश करती है MEMORY
। लेकिन MEMORY का उपयोग नहीं किया जा सकता है
TEXT
/ BLOB
कॉलम को लाया जा रहा है, नहीं भी TINYTEXT
।VARCHAR
कुछ राशि से बड़ा, वर्तमान संस्करण में शायद 512 है।इसके अलावा, ध्यान दें कि VARCHARs
बदल गए हैं CHARs
। तो, स्तंभ में जो भी है, 765 बाइट्स के विस्तार के VARCHAR(255)
साथ CHARACTER SET utf8
। फिर, यह ट्रिगर किया जा सकता है:
MEMORY
तालिका max_heap_table_size
या तो बड़ी हो जाती है याtmp_table_size
, इसे MyISAM में बदल दिया जाएगा और डिस्क पर संभावित फैल जाएगा।तो, रहने VARCHAR(25)
की अधिक संभावना है MEMORY
, इसलिए तेज हो। (255)
उतना अच्छा नहीं है, और (64000)
बुरा है।
(भविष्य में, अस्थायी सारणी शायद होंगी InnoDB
, और इस उत्तर के हिस्से को संशोधित करने की आवश्यकता होगी।)
एक वर्कर कॉलम जो आकार पूरी टेबल पर प्रश्न बनाता है और अस्थायी टेबल का उपयोग करने की अधिक संभावना है। उच्च प्रदर्शन MySQL पुस्तक के अनुसार। जब ऑप्टिमाइज़र यह देखने की कोशिश करता है कि क्या वह इस क्वेरी को मेमोरी में चला सकता है या यदि उसे एक अस्थायी तालिका की आवश्यकता है, तो यह तालिका की परिभाषा के आधार पर पंक्ति आकार को देखता है, मतलब, गति के लिए यह देखने की कोशिश नहीं करता है कि 64K वर्णों में से कितना आप वास्तव में उपयोग कर रहे हैं। यही कारण है कि लेखक आपको सलाह देते हैं कि वास्तविक संभावित मानों से परे वह परिभाषा रास्ता न खींचे जो कॉलम में जाएगी। जाहिर है, यदि आप खुद को अधिक टेम्परिंग टेबल में जाने के लिए सेट करते हैं (भले ही वास्तविक डेटा आकार रैम में फिट हो सकता है) तो अब आप आई / ओ दंड से बच सकते हैं।
यह मेरी समझ है कि छोटे क्षेत्र सीधे सूचकांक में शामिल हो सकते हैं, जबकि लंबे समय तक नहीं रह सकते हैं। उस सीमा के कारण, यदि आप चाहते हैं कि तार अनुक्रमित हों, तो मैं कहूंगा कि उन्हें छोटा रखें। अन्यथा, नहीं, यह देखते हुए कि वे दोनों वर्कर कैसे हैं और फिर छँटाई या तुलना करना पसंद करते हैं, समय की तरह काम करेंगे, चाहे क्षेत्र 25 हो या अधिकतम।
सुनिश्चित करें कि आप कमरे से बाहर नहीं चलते हैं
इस वाक्यांश का अर्थ है कि आप प्रश्न पूछते हैं क्योंकि आप उस डेटा के बारे में निश्चित नहीं हैं जिसे आप डेटाबेस में संग्रहीत कर रहे हैं। यदि यह सच है, तो आपको जितनी जल्दी हो सके यह पता लगाने के लिए अच्छी तरह से परोसा जाएगा, क्योंकि आपको क्षमता योजना के लिए इसकी आवश्यकता होगी। यदि आप उदाहरण के लिए 7000 वर्णों के साथ डेटा तत्व प्राप्त कर रहे हैं, तो आपको यह जानना होगा कि किसी भी DBMS पर प्रदर्शन के निहितार्थ होंगे।
उस ने कहा, मैं अपेक्षित सामग्री से संबंधित स्तंभ आकार रखना पसंद करता हूं। उदाहरण के लिए, एक फ़ोन नंबर 50 अक्षरों से अधिक लंबा होने की संभावना नहीं है, भले ही आप एक देश कोड और एक्सटेंशन शामिल करें। इसी तरह, एक ज़िप या पोस्टल कोड की संभावना 20 अक्षर या उससे कम होगी।