क्या खाली कॉलम मान एक भरे हुए कॉलम मान के समान संग्रहण स्थान पर कब्जा कर लेता है?


16

मेरे पास 2 कॉलम वाली एक टेबल है। दोनों स्तंभों का प्रकार सेट है varchar(38)। यदि मैं स्तंभों में से किसी एक के लिए एक खाली मान के साथ एक पंक्ति बनाता हूं, तो क्या यह उसी संग्रहण स्थान को ले जाएगा जैसे मान रिक्त नहीं था?

दूसरे शब्दों में, क्या पंक्ति बनाते समय MySQL कॉलम (इसके प्रकार के आधार पर) के लिए संग्रहण स्थान आरक्षित करेगा?

जवाबों:


11

से InnoDB शारीरिक पंक्ति संरचना, bulletpoint # 7 बेमानी ROW_FORMAT के तहत

SQL NULL मान रिकॉर्ड निर्देशिका में एक या दो बाइट्स रखता है। इसके अलावा, एक SQL NULL मान शून्य बाइट्स को रिकॉर्ड के डेटा भाग में रखता है यदि एक चर लंबाई कॉलम में संग्रहीत किया जाता है । एक निश्चित लंबाई वाले कॉलम में, यह रिकॉर्ड के डेटा भाग में कॉलम की निर्धारित लंबाई को सुरक्षित रखता है। NULL मानों के लिए निश्चित स्थान का पुनर्निर्माण NULL से स्तंभ के एक अद्यतन को गैर-NULL मान में सक्षम करता है जो सूचकांक पृष्ठ के विखंडन के बिना किया जा सकता है।

से InnoDB शारीरिक पंक्ति संरचना, bulletpoint # 2 कॉम्पैक्ट ROW_FORMAT के तहत

रिकॉर्ड हेडर के चर-लंबाई वाले हिस्से में NULL कॉलम को इंगित करने के लिए थोड़ा वेक्टर होता है। यदि अनुक्रमणिका में स्तंभों की संख्या NULL हो सकती है, तो बिट वेक्टर CEILING (N / 8) बाइट्स पर कब्जा कर लेता है । (उदाहरण के लिए, यदि 9 से 15 स्तंभों में से कहीं भी NULL हो सकता है, तो बिट वेक्टर दो बाइट्स का उपयोग करता है।) कॉलम जो NULL हैं, वे इस वेक्टर में बिट के अलावा अन्य स्थान पर कब्जा नहीं करते हैं । शीर्ष लेख के चर-लंबाई वाले हिस्से में भी चर-लंबाई स्तंभों की लंबाई होती है। कॉलम की अधिकतम लंबाई के आधार पर प्रत्येक लंबाई में एक या दो बाइट्स होते हैं। यदि अनुक्रमणिका के सभी स्तंभ NULL नहीं हैं और उनकी निश्चित लंबाई है, तो रिकॉर्ड शीर्ष लेख में कोई चर-लंबाई वाला भाग नहीं है।

इन बुलेटपॉइंट्स के आधार पर, यहां NULLएक कॉलम के भंडारण के लिए एक मूल्य है

  • चर लंबाई: एक पूर्ण मान पंक्ति में कोई संग्रहण नहीं लेता है
  • निश्चित लंबाई: आरक्षित स्थान तक ले जाती है

अब, आपको CHAR और VARCHAR के उपयोग के बीच यह तय करना होगा कि पहला बिंदु क्या लाया है

NULL मानों के लिए निश्चित स्थान का पुनर्निर्माण NULL से स्तंभ के एक अद्यतन को गैर-NULL मान के लिए सक्षम करता है जो सूचकांक पृष्ठ के विखंडन के बिना किया जा सकता है

यह गैर-पूर्ण डेटा संग्रहीत होने पर सड़क के नीचे जाने वाली पंक्ति के किसी भी विखंडन को रोकने से रोक देगा। यह कुछ ऐसा है जो मैंने MyISAM के संबंध में पहले चर्चा की है: मेरी पुरानी पोस्ट देखें निश्चित आकार के क्षेत्र पर CHAR बनाम VARCHAR का उपयोग करने का प्रदर्शन प्रभाव क्या है?


हाय रोलैंडो, एक और आइटम था जिसका मैं उल्लेख करना भूल गया था, एक varchar (5) और varchar (100) प्रकार की घोषणा के बीच स्मृति आवंटन में अंतर। या वास्तव में ओवर-एलोकेशन द्वारा किया गया जुर्माना।
क्रेग एफ्रेइन

@CraigEfrein आपको निश्चित रूप से स्मृति आवंटन को अपने उत्तर में जोड़ना चाहिए। (BTW मैं पहले से ही आपके जवाब
upvot

1
ओवर-आवंटन के लिए जुर्माना तब होता है जब आपके पास एक जटिल होता है SELECTजिसे एक अस्थायी तालिका बनाने की आवश्यकता होती है। यदि संभव हो, इसका इस्तेमाल करेंगे MEMORY, और परिवर्तित VARCHARकरने के लिए CHARtmp तालिका के लिए। अब VARCHAR(100)एक निश्चित 100 (या 300) बाइट लेता है, जिससे संभवतः क्वेरी धीमा हो जाती है।
रिक जेम्स 16

@RolandoMySQLDBA, क्या व्यवहार आपके उत्तर में मैसूर 5.7 डायनामिक और कम्पैक्ट पंक्ति स्वरूपों के लिए लागू है।
दिनेश कुमार

@DineshKumar ये पैराग्राफ अभी भी 5.7 / 8.0 डॉक्स में हैं। कृपया डायनामिक के लिए dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html देखें ।
रोलैंडमाइसीडीडीबीए

8

आपके वार्चर कॉलम के लिए निर्धारित लंबाई के बावजूद, खाली कॉलम द्वारा उपयोग किया जाने वाला संग्रहण स्थान समान होगा।

CHAR और VARCHAR प्रकार

यहाँ छवि विवरण दर्ज करें

यह केवल varchar स्तंभ द्वारा उपयोग किए जाने वाले स्थान को संबोधित करता है और पंक्ति, उसके अनुक्रमित, प्राथमिक कुंजी और अन्य स्तंभों द्वारा उपयोग किए जाने वाले कुल संग्रहण स्थान पर विचार नहीं करता है।

जैसा कि ypercube ने अपनी टिप्पणी में उल्लेख किया है, पंक्ति भंडारण के लिए अतिरिक्त विचार हैं जब एक कम से कम एक अशक्त स्तंभ मौजूद हो।

इनोडब फिजिकल रो स्ट्रक्चर

रिकॉर्ड हेडर के चर-लंबाई वाले हिस्से में NULL कॉलम को इंगित करने के लिए थोड़ा वेक्टर होता है। अगर कहीं भी 9 से 15 कॉलम हैं जो NULL हो सकते हैं, तो बिट वेक्टर दो बाइट्स का उपयोग करता है।)

...

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

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

MySQL यहाँ डेटा भंडारण को अनुकूलित करने की सिफारिशें करता है: डेटा आकार का अनुकूलन

अपडेट करें

वरचर के साथ एक अतिरिक्त विचार और वह स्मृति है। जितना संभव हो एक चर लंबाई के कॉलम के आकार को सीमित करने के लिए MySQL में यह महत्वपूर्ण है। भले ही स्तंभ परिवर्तनशील है और उपयोग की जाने वाली संग्रहण जगह परिवर्तनशील है, MySQL मूल्यों को संग्रहीत करने के लिए निश्चित-विखंडू में मेमोरी आवंटित करेगा। उदाहरण के लिए, varchar (200) अधिक मेमोरी का उपयोग करेगा जो varchar (5)। यह संग्रहण स्थान समस्या नहीं है, लेकिन फिर भी अपने कॉलमों को परिभाषित करते समय कुछ पर विचार करें।


उपरोक्त संख्याएँ CHARACTER SETलैटिन 1 या एसेसी मानती हैं । Utf8 के लिए, स्टोरेज आवश्यक CHAR(4)है 12.
रिक जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.