2008-10-22 15 views
8

मेरी परियोजनाओं में से एक MySQL में MyISAM इंजन का उपयोग करती है, लेकिन मैं इसे InnoDB में बदलने पर विचार कर रहा हूं क्योंकि मुझे यहां और वहां लेन-देन समर्थन की आवश्यकता है।क्या कोई समस्या है/चीजें जिन्हें आप जानना चाहते हैं जब MyISAM से InnoDB

  • मुझे ऐसा करने से पहले क्या देखना चाहिए या विचार करना चाहिए?
  • क्या मैं सिर्फ इंजन बदल सकता हूं, या डेटा इसके लिए तैयार होना चाहिए?

उत्तर

8

हाँ बिल्कुल, वहाँ बहुत सी बातें कर रहे हैं, आप अपने आवेदन अत्यंत अच्छी तरह से परीक्षण करना चाहिए:

  • लेनदेन गतिरोध और बार-बार जाने की जरूरत है सकते हैं। यह मामला है (कुछ परिस्थितियों में) यहां तक ​​कि एक स्वत: प्रेषित लेनदेन के साथ जो केवल एक पंक्ति डालता है।
  • डिस्क उपयोग लगभग निश्चित रूप से
  • मैं/राईट दौरान हे भार लगभग निश्चित रूप से अनुक्रमण के
  • व्यवहार में वृद्धि बदल जाएगा बढ़ जाएगी क्योंकि InnoDB क्लस्टर अनुक्रमित का उपयोग करता है - यह कुछ मामलों
  • आपके बैकअप में एक लाभदायक प्रभाव हो सकता है रणनीति पर असर पड़ेगा। इस पर ध्यान से विचार करें।

माइग्रेशन प्रक्रिया को सावधानीपूर्वक योजनाबद्ध करने की आवश्यकता होगी, क्योंकि यदि आपके पास बहुत अधिक डेटा है (उस समय के दौरान डेटा या तो पढ़ा जाएगा, या पूरी तरह से अनुपलब्ध होगा - जांचें!)

0

प्रदर्शन विशेषताएं अलग-अलग हो सकती हैं, इसलिए आपको लोड पर नजर रखने की आवश्यकता हो सकती है।

डेटा ठीक होगा।

3

बस तालिका को बदलने और इंजन को सेट करना ठीक होना चाहिए।

  • बड़ा लोगों में से एक बाहर देखने के लिए है कि select count(*) from MyTable MyISAM से InnoDB में ज्यादा धीमी है।
  • सर्वर के पुनरारंभ होने के बाद auto_increment मान तालिका +1 में उच्चतम मान पर रीसेट हो जाएंगे - यदि आपके पास कुछ डिलीट्स के साथ गन्दा डीबी है तो यह अजीब समस्याएं पैदा कर सकता है।
  • इष्टतम सर्वर सेटिंग्स मुख्य रूप से MyISAM डीबी के लिए अलग होने जा रही हैं।
  • सुनिश्चित करें कि innodb फ़ाइल का आकार आपके सभी डेटा को पकड़ने के लिए काफी बड़ा है या जब आप टेबल के इंजन बदलते हैं तो आपको लगातार पुनर्वितरण द्वारा क्रूस पर चढ़ाया जाएगा।
5

कुछ अन्य नोट्स:

InnoDB आप एक तालिका/डेटाबेस ड्रॉप के बाद फाइल सिस्टम पर मुक्त अंतरिक्ष पुनः आवंटित नहीं करता है या एक रिकॉर्ड को हटाने, इस से "डंपिंग और आयात" या में innodb_file_per_table=1 की स्थापना हल किया जा सकता मेरी .cnf।

एक बड़ी InnoDB तालिका पर इंडेक्स जोड़ना/निकालना काफी दर्दनाक हो सकता है, क्योंकि यह वर्तमान तालिका को ताला लगाता है, आपके संशोधित इंडेक्स के साथ एक अस्थायी बनाता है और पंक्ति द्वारा डेटा-पंक्ति डालता है। plugin from Innobase है, लेकिन यह केवल MySQL 5 के लिए काम करता है।1

इनो डीबी भी बहुत अधिक मेमोरी तीव्र है, मेरा सुझाव है कि आप innodb_buffer_pool_size वैरिएबल के रूप में अपने सर्वर मेमोरी (70-80% सुरक्षित शर्त होना चाहिए) के रूप में बड़े पैमाने पर होने का सुझाव देते हैं। यदि आपका सर्वर यूनिक्स/लिनक्स है, तो डबल बफरिंग से बचने के लिए sysctl चर vm.swappiness से 0 को कम करने पर विचार करें और innodb_flush_method=O_DIRECT का उपयोग करें। हमेशा उन परीक्षणों को टॉगल करते समय स्वैप हिट करते समय परीक्षण करें। आप हमेशा Percona blog पर और अधिक पढ़ सकते हैं, जो कि बढ़िया है।

इसके अलावा, आप --single-transaction --skip-lock-tables के साथ चला सकते हैं और बैकअप शुरू होने पर कोई टेबल लॉक नहीं है।

किसी भी मामले में, InnoDB बहुत अच्छा है, कुछ नुकसान आपको निराश न होने दें।

1

यदि आप समवर्ती प्रश्न प्राप्त करने के तरीके के रूप में इनो डीबी का उपयोग करने का इरादा रखते हैं, तो आप innodb_file_trx_commit=1 सेट करना चाहेंगे ताकि आपको कुछ प्रदर्शन वापस मिल सके। ओटीओएच, यदि आप अपने आवेदन को लेनदेन के बारे में जागरूक करने के लिए फिर से कोड करना चाहते हैं, तो इस सेटिंग का निर्णय इनो डीडी सेटिंग्स की आवश्यक सामान्य प्रदर्शन समीक्षा का हिस्सा होगा।

अन्य प्रमुख बात यह है कि इनओडीबी फुलटेक्स्ट इंडेक्स का समर्थन नहीं करता है, न ही इंसर्ट डेलेड का समर्थन करता है। लेकिन फिर, माईसाम रेफरेंसियल अखंडता का समर्थन नहीं करता है। :-)

हालांकि, आप केवल उन तालिकाओं को स्थानांतरित कर सकते हैं जिनके लिए आपको लेनदेन की आवश्यकता है। मैंने यह किया है छोटे टेबल (कई हजार पंक्तियों तक) अक्सर आकस्मिक रूप से ऑन-द-फ्लाई बदल सकते हैं।

+4

आपको innodb_file_trx_commit को 0 या 2 पर सेट करना चाहिए, न कि 1. –

+0

मेरा बुरा, हाँ 2 अनुशंसित सेटिंग है यदि आप माइयासम से ट्रांसएक्शन-अज्ञान कोड के साथ आ रहे हैं। – staticsan

7

एक बड़ी चेतावनी है। यदि आपको लिखने के दौरान किसी भी तरह की हार्डवेयर विफलता (या समान) मिलती है, तो InnoDB तालिकाओं को भ्रष्ट कर देगा।

माईसैम भी होगा, लेकिन एक माइस्क्लेक - ऑटो-रिपेयर उनकी मरम्मत करेगा। InnoDB तालिकाओं के साथ इसे आज़माकर विफल हो जाएगा। हाँ, यह अनुभव से है।

इसका मतलब है कि आपको InnoDB का उपयोग करने के लिए एक अच्छी नियमित डेटा बैकअप योजना की आवश्यकता है।

+0

यह कहना अधिक सटीक है कि Innodb दूषित डेटा स्वीकार नहीं करेगा। –

संबंधित मुद्दे