2009-07-20 9 views
54

MySQL कैसे एक वर्चर फ़ील्ड स्टोर करता है? मैं मान सकते हैं कि निम्नलिखित पैटर्न समझदार भंडारण आकार का प्रतिनिधित्व करता है:MySQL के लिए इष्टतम वर्चर आकार क्या हैं?

1,2,4,8,16,32,64,128,255 (अधिकतम)

उदाहरण के माध्यम से स्पष्टीकरण। आइए कहें कि मेरे पास 20 वर्णों का वर्चर फील्ड है। क्या MySQL इस क्षेत्र को बनाते समय, मूल रूप से 32 बाइट्स के लिए आरक्षित स्थान (सुनिश्चित नहीं है कि वे बाइट हैं या नहीं) लेकिन केवल 20 को दर्ज करने की अनुमति दें?

मुझे लगता है कि मैं एक विशाल मेज के लिए डिस्क स्थान को अनुकूलित करने के बारे में चिंतित हूं।

+7

मैं यह इंगित करना चाहता था कि MySQL 5.0.3 वर्कर 65,535 – joshtronic

उत्तर

46

प्रश्न का उत्तर देने के लिए, डिस्क पर MySQL 1 + आकार का उपयोग करता है जो डेटा को संग्रहीत करने के लिए फ़ील्ड में उपयोग किया जाता है (इसलिए यदि कॉलम वर्चर (45) घोषित किया गया था, और फ़ील्ड "FooBar" था तो यह 7 का उपयोग करेगा डिस्क पर बाइट, बेशक आप एक मल्टीबाइट चरित्र सेट का उपयोग करते हैं, जहां यह 14 बाइट्स का उपयोग करेगा)। इसलिए, हालांकि आप अपने कॉलम घोषित करते हैं, यह स्टोरेज एंड पर कोई फर्क नहीं पड़ता है (आपने कहा है कि आप बड़े टेबल के लिए डिस्क ऑप्टिमाइज़ेशन के बारे में चिंतित हैं)। हालांकि, यह प्रश्नों में एक फर्क पड़ता है, क्योंकि VARCHAR को CHAR में परिवर्तित कर दिया जाता है जब MySQL एक अस्थायी तालिका (सॉर्ट, ऑर्डर, इत्यादि) बनाता है और जितना अधिक रिकॉर्ड आप एक पृष्ठ में फिट कर सकते हैं, उतनी कम मेमोरी और तेज़ी से आपकी टेबल स्कैन होगी हो।

+0

एचएम? तो, multibyte charset पर यह ((आकार) + 2) है? – andyk

+3

नहीं, मल्टीबाइट पर यह है (आकार * 2) + 1. –

+2

@ क्रिस: मेरा मानना ​​है कि यह भी हो सकता है (आकार * 3) + 1 या यहां तक ​​कि (आकार * 4) + 1, नहीं? –

22

MySQL रिकॉर्ड प्रकार को इंगित करने के लिए एक-बाइट या दो-बाइट उपसर्ग के साथ एक चरखी लंबाई रिकॉर्ड के रूप में एक वर्चर फ़ील्ड स्टोर करता है।

स्टोरेज आकारों का एक पैटर्न होने से वास्तव में कोई फर्क नहीं पड़ता कि चरम लंबाई रिकॉर्ड स्टोरेज से निपटने के दौरान MySQL कैसे काम करेगा। एक वर्चर (एक्स) घोषणा में निर्दिष्ट लंबाई बस उस डेटा की अधिकतम लंबाई निर्धारित करेगी जिसे संग्रहीत किया जा सकता है। असल में, एक वर्कर (16) एक वर्कर (128) से अलग डिस्क-वार नहीं है।

This manual page में एक और विस्तृत स्पष्टीकरण है।

संपादित करें: आपके अपडेट किए गए प्रश्न के संबंध में, उत्तर अभी भी वही है। एक वर्चर फ़ील्ड डिस्क पर उतनी ही अधिक जगह का उपयोग करेगा जितना आपके द्वारा संग्रहीत डेटा (साथ ही एक या दो बाइट ओवरहेड)। इसलिए इससे कोई फर्क नहीं पड़ता कि आपके पास वर्चर (16) या वर्कर (128) है, यदि आप इसमें 10-वर्ण वाली स्ट्रिंग संग्रहीत करते हैं, तो आप डिस्क स्पेस के 10 बाइट्स (प्लस 1 या 2) का उपयोग करने जा रहे हैं ।

+30

के ऊपर हो सकता है वास्तव में पहुंच के अनुसार यह एक बड़ा अंतर बनाता है, क्योंकि जब MySQL ने स्मृति में परिणाम सेट बनाया है, तो यह इसे मैट्रिक्स में बदल देता है, इस प्रकार यदि आपका सबसे बड़ा क्षेत्र 16 वर्ण है, लेकिन फ़ील्ड को 128 अक्षरों के रूप में परिभाषित किया गया है जिसे आपको प्रत्येक पंक्ति के लिए अतिरिक्त 112 वर्ण आवंटित करना होगा। यह बहुत मेमोरी बर्बाद करता है। –

+2

न केवल आपको स्मृति में प्रत्येक पंक्ति के लिए अतिरिक्त 112 वर्ण आवंटित करना होगा, लेकिन प्रत्येक पंक्ति को फिर से चालू होने पर आपके पास बहुत अधिक L1 कैश मिस होगा। इसकी तुलना VARCHAR (16) कॉलम प्रकार से की जाती है, जहां आप इस कॉलम के साथ उच्च-गति कैश अंडर-द-हूड में बहुत अधिक पंक्तियां निचोड़ सकते हैं। –