2011-05-26 7 views
7

मैंने सुना है (एक सहयोगी से, जिसने इसे किसी अन्य डेवलपर से सुना है) कि VARCHAR कॉलम हमेशा MySQL में तालिका परिभाषा के अंत में रखा जाना चाहिए, क्योंकि वे लंबाई में परिवर्तनीय हैं और इसलिए प्रश्नों को धीमा कर सकते हैं।क्या MySQL में तालिका परिभाषाओं के अंत में VARCHAR कॉलम लगाए जाने चाहिए?

स्टैक ओवरफ़्लो पर मैंने जो शोध किया है, वह इस पर विरोधाभास करता है और सुझाव देता है कि कॉलम ऑर्डर महत्वपूर्ण है, जबकि इस पर भिन्नता है कि यह वर्चर्स पर कितना लागू होता है।

वह स्टोरेज इंजन के बारे में विशिष्ट नहीं था, या इसके बारे में यह केवल वचरर कॉलम पर लागू होता है जिसे अक्सर एक्सेस किया जाता है।

+0

संभावित डुप्लिकेट [क्या तालिका में कॉलम का क्रम मामला है?] (Http://stackoverflow.com/questions/4453429/does-the-order-of-columns-in-the-table-matter) –

+0

वर्चर और इनट्स के लिए [mysql कॉलम ऑर्डर] का संभावित डुप्लिकेट (http: // stackoverflow।कॉम/प्रश्न/4538993/mysql-column-order-for-varchar-and-ints) –

+0

मैं एक परिदृश्य की कल्पना कर सकता हूं जहां डर होगा कि एक संख्या की तरह एक छोटा स्तंभ रिकॉर्ड के 'अंत' पर होगा, और तो वर्चर के अपडेट के कारण किसी भी तरह का रिकॉर्ड जंजीर हो जाता है, तो वह संख्या पुनर्प्राप्ति के लिए पंक्ति के 'जंजीर' हिस्से पर होगी ... मेरे पास इसे साबित करने का कोई तरीका नहीं है, लेकिन मुझे लगता है कि अधिकांश इंजन इस स्टोरेज को अनुकूलित करेंगे । – Randy

उत्तर

7

"MySQL" के बारे में है कि सवाल पूछने के रूप में MySQL भंडारण इंजन के लिए भंडारण relegates, और वे बहुत अलग तरीके से भंडारण को लागू, उपयोगी नहीं है। किसी भी व्यक्तिगत स्टोरेज इंजन के लिए इस सवाल से पूछना समझ में आता है।

मेमरी इंजन में, परिवर्तनीय लंबाई डेटा प्रकार मौजूद नहीं हैं। एक वचरर चुपचाप एक चार्ज में बदल गया है। आपके प्रश्न के संदर्भ में: इससे कोई फ़र्क नहीं पड़ता कि तालिका तालिका में आपने अपना VARCHAR कहां रखा है।

माईसाम इंजन में, यदि किसी तालिका में कोई परिवर्तनीय लंबाई डेटा नहीं है (VARCHAR, VARBINARY या कोई टेक्स्ट या BLOB प्रकार) यह MyISAM के फिक्स्ड संस्करण का है, यानी, रिकॉर्ड्स में एक निश्चित बाइट लंबाई है। इसमें प्रदर्शन प्रभाव हो सकते हैं, खासकर अगर डेटा हटा दिया जाता है और बार-बार डाला जाता है (यानी तालिका केवल संलग्न नहीं होती है)। जैसे ही कोई वैरिएबल लम्बाई डेटा प्रकार तालिका परिभाषा का हिस्सा होता है, यह माईसाम का डायनामिक संस्करण बन जाता है, और माईसाम आंतरिक रूप से किसी भी रूप में बदलता है लेकिन VARCHAR में आंतरिक रूप से सबसे छोटा CHAR प्रकार बदलता है। फिर, चार्ज/वचरर की स्थिति और यहां तक ​​कि परिभाषा कोई फर्क नहीं पड़ता।

इनो डीबी इंजन में, डेटा 16 केबी आकार के पृष्ठों में संग्रहीत किया जाता है। एक पृष्ठ में एक चेकसम के साथ एक पृष्ठ पाद लेख होता है, और एक पृष्ठ शीर्षलेख होता है, जिसमें अन्य चीजों के साथ एक पृष्ठ निर्देशिका होती है। पृष्ठ निर्देशिका प्रत्येक पृष्ठ के लिए पृष्ठ की शुरुआत के सापेक्ष उस पंक्ति के ऑफसेट के लिए होती है। एक पृष्ठ में नि: शुल्क स्थान भी होता है, और सभी I/O पृष्ठों में किया जाता है।

इसलिए इनओडीबी, जब तक किसी पृष्ठ में खाली स्थान हो, तब तक VARCHAR बढ़े, और किसी भी अतिरिक्त I/O के बिना किसी पृष्ठ के अंदर पंक्तियों को स्थानांतरित कर सकते हैं। इसके अलावा, चूंकि सभी पंक्तियों को (पेजनंबर, पृष्ठ निर्देशिका प्रविष्टि) के रूप में संबोधित किया जा रहा है, इसलिए पृष्ठ के अंदर एक पंक्ति का आंदोलन पृष्ठ पर स्थानांतरित होता है और बाहर से दिखाई नहीं देता है।

इसका यह भी अर्थ है कि इनो डीडी के लिए भी, पंक्तियों के अंदर स्तंभों का क्रम कोई फर्क नहीं पड़ता।

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

+0

एक प्रभावशाली व्यापक जवाब। धन्यवाद। – sfrost2004

3

इससे कोई फर्क नहीं पड़ता। और कुछ इंजन एक अलग क्षेत्र में varlena प्रकारों को स्टोर करते हैं (उदा। पोस्टग्रेस में TOAST)।

इसके अलावा, लॉजिकल ऑर्डर (जब आप चुनते हैं तो आप क्या देखते हैं *) वास्तव में भौतिक क्रम से भिन्न हो सकता है (यह कैसे संग्रहीत किया जाता है, जो उस क्रम पर आधारित है जिसमें आपने बाद में तालिका विवरणों का उपयोग करके वास्तविक कॉलम बनाए हैं)।

http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx

संबंधित मुद्दे