2011-03-11 11 views
6

मैंने सुना है कि यदि आपके पास एक टेक्स्ट कॉलम वाला एक टेबल है जिसमें टेक्स्ट डेटा का एक बड़ा हिस्सा होगा, तो प्रदर्शन के लिए बेहतर है कि उस कॉलम को एक अलग तालिका में ले जाएं और इसे बेस रिकॉर्ड में जॉइन के माध्यम से प्राप्त करें।जब आपके पास MySQL या PostgreSQL में कोई टेक्स्ट फ़ील्ड है, तो क्या आपको इसे एक अलग तालिका में रखना चाहिए?

क्या यह सच है, और यदि ऐसा है तो क्यों?

उत्तर

15
PostgreSQL साथ

नहीं, the manual से:

बहुत लंबे मान भी पृष्ठभूमि तालिकाओं में जमा हो जाती है, ताकि वे कम स्तंभ मान को तेजी से उपयोग के साथ हस्तक्षेप नहीं करते।

तो एक बड़ी चरित्र स्तंभ (जैसे TEXT या VARCHAR एक निर्दिष्ट आकार सीमा के बिना) मुख्य तालिका डेटा से दूर संग्रहित है। तो, PostgreSQL में "इसे एक अलग तालिका में रखा गया है" ऑप्टिमाइज़ेशन बनाया गया है। यदि आप PostgreSQL का उपयोग कर रहे हैं, तो अपनी तालिका को समझदारी से व्यवस्थित करें और डेटा लेआउट PostgreSQL पर छोड़ दें।

मुझे नहीं पता कि MySQL या अन्य RDBM उनके डेटा की व्यवस्था कैसे करते हैं।

इस अनुकूलन के पीछे कारण यह है कि जब डेटाबेस को पंक्ति को पढ़ने या अपडेट करने की आवश्यकता होती है तो डेटाबेस पर डिस्क पर संगत ब्लॉक में प्रत्येक पंक्ति के लिए डेटा रखना होगा। यदि आपके पास एक पंक्ति में टेक्स्ट (या अन्य परिवर्तनीय लंबाई प्रकार) कॉलम है तो पंक्ति का आकार परिवर्तनीय है इसलिए पंक्ति से पंक्ति में जाने के लिए और अधिक काम की आवश्यकता है। किसी समानता को किसी सरणी तक पहुंचने के विरुद्ध किसी लिंक किए गए सूची में पहुंचने के बीच अंतर होगा; एक लिंक्ड सूची के साथ, आपको चौथे स्थान पर जाने के लिए एक बार में तीन तत्वों को पढ़ना होगा, एक सरणी के साथ आप शुरुआत से 3 * element_size बाइट ऑफ़सेट करते हैं और आप एक चरण में हैं।

1

कुछ परिदृश्यों में, यह सच हो सकता है।

create table foo (
    id serial primary key, 
    title varchar(200) not null, 
    pub_date datetime not null, 
    text_content text 
); 

तो फिर तुम इस तरह एक प्रश्न करना:

select id, title, pub_date 
    from foo; 

आप डिस्क से भी बहुत कुछ पृष्ठों है कि आप अगर आप नहीं था होगा लोड करने के लिए होगा 'कारण यह है कि मान लीजिए कि आपके तालिका में है है उस तालिका में text_content फ़ील्ड नहीं है। और क्वेरी ऑप्टिमाइज़ेशन डिस्क I/O को कम से कम संभव करने के बारे में सबसे अधिक है।

3
MySQL Manual से

:

कई कॉलम युक्त तालिका के लिए, करने के लिए क्वेरी कि ब्लॉब स्तंभ, एक अलग तालिका में ब्लॉब स्तंभ बंटवारे और संदर्भ दे का उपयोग नहीं करते के लिए स्मृति आवश्यकताओं को कम जब आवश्यक हो तो इसमें शामिल होने के साथ।