storage - Mysql table size does not match with my calculation -


मेरे पास MySQL में निम्नलिखित तालिका है:

  बनाएँ टैब 'पैराटेल' (`id_1 'INT (10) अनसाइन्ड नल डिफॉल्ट' 0 ', `id_2` INT (10) अनसाइन्ड नल डिफॉल्ट' 0 ',` id_3` TINYINT (3) अनअकेड नल डिफॉल्ट' 0 ', `id_4` TINYINT (3) अनअकेड नल डिफॉल्ट '0', `id_5` INT (10) अनसाइन्ड नल डिफॉल्ट '0',` तारीख` TIMESTAMP नल डिफ़ॉल्ट CURRENT_TIMESTAMP, इंडेक्स `आईडी_1` (` आईडी_1`), इंडेक्स `id_2` (` id_2`), इंडेक्स `तिथि` (`आईडी```), इंडेक्स` id_3` (`id_3`), इंडेक्स` id_4` (`id_4`), इंडेक्स` id_5` (`id_5`), इंडेक्स` मल्टी_ इंडेक्स` (`id_1`,` id_3`, ` Id_4`)) COLLATE = 'utf8_general_ci' इंजन = InnoDB;   

इसकी कुल संख्या लगभग 70,000,000 प्रविष्टियां है, भले ही कॉलम नल योग्य हो, कोई प्रविष्टि में कोई भी कॉलम (कोई तालिका) में कोई भी कोड (कोड) नल है यहाँ सवाल नहीं है।)

अगर मैं information_schema में देखता हूं, तो मैं देख सकता हूं कि सूचकांक की लंबाई 10272899072 है और डेटा लंबाई 3201302528 है।

यह कुल संख्या 12,850 एमबी या 12.54 जीबी के बारे में है।

यह संख्या कैसे गणना की गई है?

आउटपुट तालिका का आंकड़ा ... जैसे पैराएबल दिखाता है:

  पंक्तियाँ: 68129609 अव्ग_रो_ लैंघ: 47 डेटा_लांबी: 3201302528 (= 3053 एमबी) सूचकांक_लांबी: 10272899072 (= 9797 एमबी)   

मैंने डेटा संग्रहण आकारों के बारे में पढ़ा और निम्न अयोग्य गणना की है:

(int + int + tinyint + tinyint + int + टाइमस्टैम्प)

4 + 4 + 1 + 1 + 4 + 4 = 18 बाइट प्रति पंक्ति (+ 6 बिट, क्योंकि प्रत्येक कॉलम रिक्त है, मुझे लगता है कि मैं इन 6 बिट की गणना सिर्फ एक बाइट के रूप में कर सकता हूँ और सुरक्षित रहूंगा, देखें) = 1 9 बाइट्स प्रति पंक्ति।

(भले ही 6 में से प्रत्येक द्वि टीएस को 1 बाइट डिस्क पर ले जाता है, जो संभवत: मुझे लगता है, यह 24 बाइट प्रति पंक्ति होगी।)

  18 बाइट्स * 70,000,000 पंक्तियों = 1260000000B = ~ 1200MB (19 बाइट्स * 70,000,000 पंक्तियाँ = 1330000000B = ~ 1270 एमबी) (24 बाइट्स * 70,000,000 पंक्तियां = 1680000000B = ~ 1600MB)   

मुझे पता नहीं है कि अनुक्रमित के लिए mysql कितना स्थान लेता है (मैं केवल शो टैबस लेकिन यह कैसे वास्तव में गणना की जाती है?)। यह कुल आकार के लिए गणना में एक अनुपलब्ध लिंक है लेकिन यहां तक ​​कि अगर इंडेक्सस में इसके साथ कुछ भी नहीं है, तो Data_length अकेले बहुत अधिक लगता है।

क्यों Avg_row_length 47 को मेरे बजाय गणना 18-24 बाइट्स? मैं यहाँ क्या लापता हूं?

इन पंक्तियों को संग्रहीत करने के लिए आपने इनोडाब के सभी ओवरहेड की गणना करने में कमी महसूस की है। आपके पास होना चाहिए:

  4 (INT) + 4 (INT) + 1 (टीएनआईआईएनटी) + 1 (टीआईएनआईएनटी) + 4 (आईएनटी) + 4 (टाइमस्टैम्प) + 1 (नल बिटमैप, गोल + 5 (रो हैडर) + 6 (आरओयू_आईडी: पूर्ण क्लस्टर कुंजी, क्योंकि आप प्राथमिक कुंजी गायब हैं) + 6 (TRX_ID: लेनदेन आईडी) + 7 (ROLL_PTR: रोलबैक / पूर्ववत पॉइंटर) = 43 बाइट्स प्रति पंक्ति   

फिर आपको पृष्ठ भरने की दर के लिए भी खाता होना चाहिए (पृष्ठों को डिजाइन द्वारा 100% तक नहीं भर दिया गया है) जो कि न्यूनतम न्यूनतम पर ~ 7% जोड़ता है:

 43 * 1 / (15/16) = 45.86 बाइट प्रति पंक्ति   

इसके अतिरिक्त आपको आवंटित लेकिन अप्रयुक्त स्थान में ओवरहेड होगा।

तो वास्तव में, ~ 47 बाइट प्रति पंक्ति प्राप्त करना बिल्कुल भी बुरा नहीं है। सबसे बुरा मामला ओवरहेड के लिए होता है ~ 50% जिससे तालिका को प्रति पंक्ति 86 बाइट्स लेना होता है।

अपनी प्रत्येक माध्यमिक कुंजी के लिए, ध्यान दें कि उनकी जगह खपत ( आईडी_1 एक उदाहरण के रूप में):

  4 (INT) + 1 (रिक्त बिटमैप, पूर्ण बाइट तक गोल) + 5 (पंक्ति शीर्षलेख) + 6 (ROW_ID: पूर्ण क्लस्टर कुंजी) = 16 बाइट्स प्रति पंक्ति * 1 / (15/16) = 17.06 बाइट्स प्रति पंक्ति   

अधिक जानकारी के लिए इनओडीबी डेटा संरचनाओं के बारे में निम्नलिखित पोस्ट पढ़ना उपयोगी हो सकता है:



Comments

Popular posts from this blog

Java - Error: no suitable method found for add(int, java.lang.String) -

java - JPA TypedQuery: Parameter value element did not match expected type -

c++ - static template member variable has internal linkage but is not defined -