InnoDB "विस्तृत" तालिकाओं को एक अलग तरीके से संग्रहीत करता है। सभी स्तंभों को एक साथ एक स्ट्रिंग (प्लस ओवरहेड, जैसे लंबाई, आदि) में रखने के बजाय, यह निम्न कार्य करता है:
- यदि किसी पंक्ति के सभी स्तंभों का योग लगभग 8KB से अधिक है, तो यह कुछ डेटा को दूसरे ("ऑफ-रिकॉर्ड") संग्रहण क्षेत्र में स्थानांतरित कर देगा।
- कौन से कॉलम ऑफ-रिकॉर्ड स्थानांतरित किए गए हैं, कॉलम के आकार आदि पर निर्भर करता है।
- विवरण
ROW_FORMAT
. पर निर्भर करता है चुना गया। - "ऑफ-रिकॉर्ड" एक और 16KB ब्लॉक (या ब्लॉक) है।
- बाद में, करते समय
SELECT *
(या कम से कम ऑफ-रिकॉर्ड कॉलम लाने के लिए), इसे एक और डिस्क फ़ेच करना होगा।
क्या करें?
- इतने सारे कॉलम होने पर पुनर्विचार करें।
- "ऊर्ध्वाधर विभाजन" पर विचार करें, जिसमें आपके पास एक और तालिका है जिसमें चयनित
TEXT
है स्तंभ। अपने ऐप में एक्सेस पैटर्न के आधार पर कॉलम के समूह चुनने का सुझाव दें। - ऐसे कॉलम जो आमतौर पर काफी लंबे होते हैं, उन्हें क्लाइंट में कंप्रेस करके
BLOB
में स्टोर करने पर विचार करें।TEXT
. के बजाय . अधिकांश "पाठ" 3:1 सिकुड़ता है। ब्लॉब्स को टेक्स्ट के समान ही ऑफ-रिकॉर्ड भेजा जाता है, हालांकि, ये संकुचित बूँदें छोटी होंगी, इसलिए इनके फैलने की संभावना कम होती है। - एसक्यूएल में अधिक प्रोसेसिंग करें - सभी पंक्तियों को वापस करने से बचने के लिए, या पूर्ण टेक्स्ट को वापस करने से बचने के लिए, आदि। जब क्लाइंट को बहुत सारे टेक्स्ट को आँख बंद करके फावड़ा करते हैं, तो नेटवर्क और क्लाइंट बीता हुआ समय में एक महत्वपूर्ण कारक बन जाते हैं, न सिर्फ
SELECT
, स्वयं।