Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

InnoDB स्पष्ट रूप से झूठी खाली जगह की जानकारी क्यों देता है

(यह टिप्पणियों में दबे कुछ सवालों के जवाब दे रहा है।)

गलत नाम "निःशुल्क" स्थान में केवल संपूर्ण ब्लॉक शामिल हैं, ब्लॉक के अंदर अतिरिक्त कमरा नहीं, और कई अन्य विवरण शामिल हैं।

केस 1:सभी टेबल ibdata1 में हैं -- SHOW TABLE STATUS (या समतुल्य क्वेरी information_schema . में वही दिखाएगा Data_free मूल्य, अर्थात् ibdata1 . में कितना निःशुल्क है . इस स्थान का किसी भी तालिका द्वारा पुन:उपयोग किया जा सकता है। OS को वापस स्पेस देना मुश्किल है।

केस 2:सभी टेबल file_per_table हैं -- अब प्रत्येक Data_free तालिका के लिए स्थान को संदर्भित करता है। और SUM() अर्थपूर्ण है। (ibdata1 अभी भी मौजूद है, लेकिन इसमें कोई वास्तविक तालिका नहीं है; और भी बहुत सी अन्य चीजें हैं जिनकी InnoDB को आवश्यकता है।)

केस 3:मिश्रण -- अगर आप file_per_table को कई बार चालू/बंद करते हैं, तो कुछ टेबल ibdata1 में होंगी, कुछ के अपने टेबल स्पेस होंगे।

केस 4:5.7 में टेबलस्पेस बनाएं -- उदाहरण के लिए, आपके पास प्रत्येक डेटाबेस के लिए एक टेबलस्पेस हो सकता है।

केस 5:विभाजित टेबल -- प्रत्येक विभाजन एक तालिका की तरह कार्य करता है।

केस 6:8.0 -- और भी बदलाव आ रहे हैं।

डेटाबेस ==निर्देशिका MySQL के डायरेक्टरी ट्री में प्रत्येक डेटाबेस को फाइल सिस्टम डायरेक्टरी के रूप में देखा जा सकता है। उस निर्देशिका के भीतर प्रत्येक तालिका के लिए फाइलों का कुछ सेट देखा जा सकता है। .frm फ़ाइल में तालिका परिभाषा है। अगर एक .ibd फ़ाइल मौजूद है, तालिका file_per_table के साथ बनाई गई थी। यह पता लगाने का सबसे विश्वसनीय तरीका हो सकता है कि तालिका file_per_table है या नहीं। (8.0 में यहां महत्वपूर्ण बदलाव होंगे।)

मैं कितनी जगह का पुन:उपयोग कर सकता हूं ? कोई अच्छा जवाब नहीं है। आम तौर पर एक पंक्ति डालने से उस ब्लॉक में जगह मिल जाएगी जहां वह संबंधित है, और डेटा_फ्री कम नहीं होगा। लेकिन, यदि ब्लॉक विभाजन होते हैं, तो Data_free 16KB (ब्लॉक आकार) या 4MB ("सीमा आकार" - या शायद यह 8MB है?) के कुछ गुणकों से गिर सकता है। साथ ही, रैंडम इंसर्ट से BTree ब्लॉक औसतन लगभग 69% भरे हुए हैं।

innodb_file_per_table बदलना अगले CREATE TABLE . तक कोई प्रभाव नहीं पड़ता है या ALTER TABLE . और फिर इसका केवल इस बात पर प्रभाव पड़ता है कि नए बनाए गए/कॉपी किए गए डेटा + इंडेक्स (ibdata1 या .ibd) को कहां रखा जाए। यह डेटा को नष्ट नहीं करेगा।

बड़ी टेबल आमतौर पर 4MB से 7MB का Data_free होता है। आप कितनी पंक्तियों को जोड़ सकते हैं, इसकी गणना करते समय, डेटा_फ्री को उस सीमा से नीचे छोड़ने की योजना न बनाएं।

औसत_रो_आकार उपयोगी होना चाहिए। लेकिन कभी-कभी यह (और पंक्तियाँ) खराब रूप से अनुमानित होती हैं। उनका उत्पाद (Data_length) हमेशा सही होता है। तो, यह हो सकता है "OS से अधिक स्थान हथियाने से पहले जाने वाली पंक्तियों का एक अच्छा अनुमान हो:

(Data_free - 7M) / Avg_row_size

टेबलस्पेस अनुशंसाएं :file_per_table में 'बिग' टेबल लगाएं। ibdata1 या डेटाबेस-विशिष्ट टेबलस्पेस (5.7) में 'छोटे' टेबल रखें। क्षमा करें, 'बड़ा' और 'छोटा' के बीच विभाजन रेखा पर कोई सरल अनुशंसा नहीं है। और किसी तालिका को माइग्रेट करना अनाड़ी है:SET global innodb_file_per_table = ...;; लॉग आउट; लॉगिन (वैश्विक लेने के लिए); ALTER TABLE tbl ENGINE=InnoDB; . और यह अनिवार्य रूप से तालिका की एक पूर्ण प्रति है।

(चेतावनी :मैंने कई विवरण छोड़ दिए हैं।)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्टार्टअप पर MySQL क्रैश

  2. MySQL केवल अनावश्यक पंक्तियों का चयन करें और मूल पंक्तियों को छोड़ दें

  3. SQL आदेश H2 द्वारा अनुपालन योग्य नहीं हैं

  4. वसंत/हाइबरनेट के साथ मैं किस MySQL ड्राइवर का उपयोग करता हूं?

  5. MySQL 5.7 में चर का उपयोग करके प्रकार की कार्यक्षमता द्वारा विभाजन कैसे प्राप्त करें