Innodb_file_per_table का उपयोग क्यों?
क्योंकि व्यक्तिगत प्रबंधन करना आसान है क्योंकि यह फ़ाइल-स्तर पर किया जा सकता है। इसका मतलब है कि भले ही सर्वर डाउन हो, आप अभी भी टेबल फ़ाइलों को कॉपी करके डेटा कॉपी कर सकते हैं, जबकि साझा टेबल-स्पेस का उपयोग करने का मतलब या तो हर चीज की नकल करना है, जो अनावश्यक रूप से बड़े पैमाने पर हो सकता है, या डेटा निकालने के लिए सर्वर को चलाने के लिए कोई रास्ता खोज सकता है ( आप वास्तव में हेक्स-एडिटर के साथ डेटा को मैन्युअल रूप से निकालना नहीं चाहते हैं)।
किसी ने चेतावनी दी कि आप .ibd
फ़ाइलों को एक सर्वर से दूसरे सर्वर पर कॉपी और पेस्ट नहीं कर सकते । यह सच हो सकता है, लेकिन यह उसी सर्वर पर बैकअप के लिए लागू नहीं होना चाहिए (मैं शब्द का उपयोग कर रहा हूं कॉपी बनाने के पारंपरिक अर्थ में यहां बैकअप ; यानी, पूरी तरह से नहीं बदल रहा है)। इसके अलावा, ibdata1
स्वचालित रूप से स्टार्टअप पर फिर से बनाया गया है (जैसा कि "फ़ाइल-प्रति-तालिका में बदलना" गाइड के डिलीटibdata1
चरण में देखा गया है )। जैसे, आपको अपनी फ़ाइलों (और उनकी संगत , आदि फ़ाइलों) के अलावा कॉपी करने की आवश्यकता नहीं है ।ibdata1
.ibd
.frm
यदि एक खोई हुई मेज को पुनर्प्राप्त करने का प्रयास किया जा रहा है, तो इसकी प्रतिलिपि .ibd
और .frm
फ़ाइल की प्रतिलिपि बनाने के लिए पर्याप्त होना चाहिए , साथ ही साथ information_schema
(जो कि बहुत छोटा है ibdata1
)। इस तरह, आप उन्हें एक डमी सर्वर में रख सकते हैं और पूरी, बड़े पैमाने पर चीज़ की नकल किए बिना अपनी तालिका निकाल सकते हैं।
हालांकि, बेहतर प्रदर्शन का दावा संदिग्ध है। … Innodb_file_per_table के साथ, अधिक डिस्क I / O संचालन की आवश्यकता है; और यह जटिल JOINs और FOREIGN KEY बाधाओं में महत्वपूर्ण है।
आश्चर्य की बात नहीं, प्रदर्शन पूरी तरह से उपयोग में विशिष्ट डेटाबेस (नों) पर निर्भर करेगा। एक व्यक्ति के पास (दूसरे से भी) अलग-अलग परिणाम होंगे।
यह सच है कि फ़ाइल-प्रति-तालिका के साथ अधिक डिस्क I / O संचालन होंगे, लेकिन केवल थोड़ा अधिक। सिस्टम कैसे काम करता है, इसके बारे में सोचें।
आप देखेंगे कि जब सर्वर चल रहा है, तो आप डेटा फ़ाइलों को स्थानांतरित नहीं कर सकते क्योंकि सर्वर के पास उनके लिए खुले हैंडल हैं। ऐसा इसलिए है क्योंकि जब यह शुरू होता है, तो यह उन्हें खोलता है और उन्हें खुला छोड़ देता है। यह प्रत्येक व्यक्तिगत क्वेरी के लिए उन्हें नहीं खोलता और बंद करता है।
जैसे, सर्वर शुरू होने पर केवल कुछ और I / O ऑपरेशन होते हैं; दौड़ते समय नहीं। इसके अलावा, जबकि प्रत्येक व्यक्ति.ibd
फ़ाइल का अपना अलग ओवरहेड (फ़ाइल हस्ताक्षर, संरचनाएं आदि) होता है, उन्हें मेमोरी में कैश किया जाता है और प्रत्येक क्वेरी के लिए पुनः नहीं पढ़ा जाता है। इसके अलावा, समान संरचनाओं को एक साझा टेबल-स्पेस के साथ भी पढ़ा जाता है, इसलिए मुश्किल से किसी भी (यदि कोई हो तो) अधिक मेमोरी की आवश्यकता होती है।
क्या innodb_file_per_table का mysql के बेहतर प्रदर्शन पर असर है?
वास्तव में, अगर कुछ भी, प्रदर्शन वास्तव में खराब हो सकता है ।
साझा तालिका-स्थान का उपयोग करते समय, पढ़ने और लिखने के संचालन को कभी-कभी / अक्सर जोड़ा जा सकता है ताकि सर्वर एक बार में कई तालिकाओं से डेटा का एक स्वैच पढ़े ibdata
।
हालाँकि, यदि डेटा कई फ़ाइलों के बीच फैला हुआ है, तो उसे हर एक के लिए अलग-अलग I / O ऑपरेशन करना होगा।
बेशक यह फिर से सवाल में डेटाबेस पर पूरी तरह से निर्भर है; वास्तविक दुनिया का प्रदर्शन प्रभाव आकार, क्वेरी आवृत्ति और साझा तालिका-स्थान के आंतरिक विखंडन पर निर्भर करेगा। कुछ लोगों को एक बड़ा अंतर दिखाई दे सकता है जबकि अन्य को कोई प्रभाव दिखाई नहीं दे सकता है।
Tablespace सिंगल ibdata पर साझा किया जाता है; कैसे अलग तालिकाओं के लिए समर्पित टेबल डिस्क स्थान बचा सकता है?
ऐसा नहीं होता। यदि कुछ भी है, तो यह डिस्क उपयोग को बढ़ाता है ।
मेरे पास परीक्षण करने के लिए एक 60GB डेटाबेस नहीं है, लेकिन मेरे "पैलेट्री" व्यक्तिगत डेटाबेस में मेरा वर्डप्रेस इंस्टॉलेशन और व्यक्तिगत उपयोग और विकास परीक्षण के लिए कुछ छोटे टेबल हैं, जो साझा टेबल-स्पेस का उपयोग करते हुए ~ 30 एमबी में वजन करते हैं। इसे फ़ाइल-प्रति-तालिका में परिवर्तित करने के बाद, यह ~ 85MB तक फूल गया। यहां तक कि सब कुछ छोड़ने और फिर से आयात करने से, यह अभी भी> 60 एमबी था।
यह वृद्धि दो कारकों के कारण है:
के लिए पूर्ण न्यूनतम आकार ibdata1
है- किसी कारण के लिए — 10 एमबी, भले ही आपके पास इसमें कुछ भी न हो, लेकिन इसमें information_schema
संग्रहित न हो।
एक साझा तालिका-स्थान के साथ, केवल ibdata1
ओवरहेड जैसे फ़ाइल हस्ताक्षर, मेटा-डेटा, आदि हैं, लेकिन प्रति-तालिका के साथ, प्रत्येक व्यक्तिगत .ibd
फ़ाइल में वह सब है। इसका मतलब है कि कुल (यहां तक कि एक काल्पनिक <10MB ibdata1
) कम से कम कुछ बड़ा होगा:
GetTotalSizeofOverhead() * GetNumTables()
स्पष्ट रूप से ये बहुत अधिक बढ़ने वाले नहीं हैं (जब तक कि आप एक होस्ट का उपयोग नहीं कर रहे हैं जो आपके डेटाबेस के आकार को सीमित करता है या फ्लैश-ड्राइव आदि पर उन्हें संग्रहीत करता है), लेकिन वे फिर भी बढ़ जाते हैं, और फ़ाइल को स्विच करते समय ( हर ) तालिका द्वारा -स्पेर-टेबल आप ibdata1
10MB तक सिकुड़ सकते हैं , कुल मिलाकर हमेशा की तुलना में अधिक होगा ।