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

MySQL प्रदर्शन:MyISAM बनाम InnoDB

डेटाबेस प्रदर्शन में एक प्रमुख कारक डेटाबेस द्वारा उपयोग किया जाने वाला स्टोरेज इंजन है, और अधिक विशेष रूप से, इसकी तालिकाएँ। विभिन्न स्टोरेज इंजन एक स्थिति में दूसरी स्थिति में बेहतर प्रदर्शन प्रदान करते हैं। सामान्य उपयोग के लिए, दो दावेदारों पर विचार किया जाना है। ये MyISAM हैं, जो कि डिफ़ॉल्ट MySQL स्टोरेज इंजन है, या InnoDB, जो उच्च-प्रदर्शन डेटाबेस के लिए MySQL में निर्मित एक वैकल्पिक इंजन है। इससे पहले कि हम दो स्टोरेज इंजनों के बीच के अंतर को समझ सकें, हमें "लॉकिंग" शब्द को समझना होगा।

MySQL में लॉकिंग क्या है?

डेटाबेस में संग्रहीत डेटा की अखंडता की रक्षा के लिए, MySQL लॉकिंग को नियोजित करता है। सीधे शब्दों में कहें तो लॉकिंग का अर्थ है डेटा को एक्सेस होने से बचाना। जब कोई लॉक लगाया जाता है, तो डेटा को उस क्वेरी के अलावा संशोधित नहीं किया जा सकता है जिसने लॉक शुरू किया था। संग्रहीत जानकारी की सटीकता सुनिश्चित करने के लिए लॉकिंग एक आवश्यक घटक है। प्रत्येक स्टोरेज इंजन में लॉकिंग की एक अलग विधि का उपयोग किया जाता है। आपके डेटा और क्वेरी प्रथाओं के आधार पर, एक इंजन दूसरे से बेहतर प्रदर्शन कर सकता है। इस श्रृंखला में, हम अपने दो स्टोरेज इंजनों द्वारा नियोजित दो सबसे सामान्य प्रकार के लॉकिंग को देखेंगे।

टेबल लॉक करना: एक संपूर्ण तालिका को लॉक करने की तकनीक जब तालिका के भीतर एक या अधिक कक्षों को अद्यतन या हटाने की आवश्यकता होती है। टेबल लॉकिंग डिफ़ॉल्ट स्टोरेज इंजन, MyISAM द्वारा नियोजित डिफ़ॉल्ट विधि है।

उदाहरण:MyISAM टेबल लॉकिंग कॉलम A कॉलम B कॉलम C
क्वेरी 1 अपडेट करें पंक्ति 1 लेखन डेटा डेटा
प्रश्न 2 चुनें (प्रतीक्षा करें) पंक्ति 2 डेटा डेटा डेटा
क्वेरी 3 अद्यतन (प्रतीक्षा करें) पंक्ति 3 डेटा डेटा डेटा
प्रश्न 4 चुनें (प्रतीक्षा करें) पंक्ति 4 डेटा डेटा डेटा
प्रश्न 5 चुनें (प्रतीक्षा करें) पंक्ति 5 डेटा डेटा डेटा
उदाहरण बताता है कि कैसे एक एकल लेखन कार्रवाई पूरी तालिका को लॉक कर देती है जिससे अन्य क्वेरीज़ को अद्यतन क्वेरी समाप्त होने की प्रतीक्षा करनी पड़ती है।

पंक्ति-स्तरीय लॉकिंग: किसी तालिका में पंक्तियों की प्रभावी श्रेणी को लॉक करने का कार्य, जबकि सीमा के भीतर एक या अधिक कक्ष संशोधित या हटाए जाते हैं। रो-लेवल लॉकिंग, InnoDB स्टोरेज इंजन द्वारा उपयोग की जाने वाली विधि है और उच्च-प्रदर्शन डेटाबेस के लिए अभिप्रेत है।

उदाहरण:InnoDB रो-लेवल लॉकिंग कॉलम A कॉलम A कॉलम A
क्वेरी 1 अपडेट करें पंक्ति 1 लेखन डेटा डेटा
प्रश्न 2 चुनें पंक्ति 2 पढ़ना डेटा डेटा
क्वेरी 3 अपडेट करें पंक्ति 3 डेटा लेखन डेटा
प्रश्न 4 चुनें पंक्ति 4 पढ़ना पढ़ना पढ़ना
प्रश्न 5 चुनें पंक्ति 5 पढ़ना डेटा पढ़ना
उदाहरण दिखाता है कि कैसे पंक्ति-स्तरीय लॉकिंग का उपयोग करने से पूरी तालिका के बजाय केवल अद्यतन की जा रही पंक्तियों को लॉक करके अलग-अलग पंक्तियों पर एकाधिक क्वेरी चलाने की अनुमति मिलती है।

MyISAM बनाम InnoDB

दो स्टोरेज इंजनों की तुलना करके, हम MyISAM पर InnoDB का उपयोग करने के बीच तर्क की जड़ तक पहुँचते हैं। एक एप्लिकेशन या वेबसाइट जिसमें अक्सर उपयोग की जाने वाली टेबल होती है, टेबल-लॉकिंग बाधाओं को हल करके इनो डीबी स्टोरेज इंजन का उपयोग करके असाधारण रूप से अच्छी तरह से काम करती है। हालाँकि, एक के ऊपर एक का उपयोग करने का प्रश्न व्यक्तिपरक है क्योंकि दोनों में से कोई भी सभी स्थितियों में परिपूर्ण नहीं है। दोनों भंडारण इंजनों की ताकत और सीमाएं हैं। आपकी तालिकाओं के लिए सर्वोत्तम भंडारण इंजन का चयन करने के लिए डेटाबेस संरचना और क्वेरी प्रथाओं का अंतरंग ज्ञान महत्वपूर्ण है।

MyISAM बड़ी तालिकाओं पर InnoDB को पछाड़ देगा, जिसके लिए बहुत अधिक पढ़ने की गतिविधि बनाम लेखन गतिविधि की आवश्यकता होती है। MyISAM की पठनीयता InnoDB से आगे निकल जाती है क्योंकि पूरी तालिका को लॉक करना यह पता लगाने की तुलना में तेज़ है कि कौन सी पंक्तियाँ तालिका में बंद हैं। तालिका में जितनी अधिक जानकारी होगी, InnoDB को यह पता लगाने में उतना ही अधिक समय लगेगा कि कौन सी पहुंच योग्य नहीं है। यदि आपका एप्लिकेशन विशाल तालिकाओं पर निर्भर करता है जो डेटा को बार-बार नहीं बदलते हैं, तो MyISAM InnoDB से बेहतर प्रदर्शन करेगा। इसके विपरीत, जब तालिका में डेटा बार-बार बदलता है, तो InnoDB MyISAM से बेहतर प्रदर्शन करता है। तालिका परिवर्तन प्रति सेकंड डेटा पढ़ने से अधिक डेटा लिखता है। इन स्थितियों में, InnoDB प्रत्येक के लिए संपूर्ण तालिका को लॉक करने की तुलना में बड़ी मात्रा में अनुरोधों को आसान बना सकता है।

क्या मुझे WordPress, Magento या Joomla Sites के साथ InnoDB का उपयोग करना चाहिए?

यहाँ संक्षिप्त उत्तर हाँ है, ज्यादातर मामलों में। जब क्लाइंट आज के कुछ मानक वेब एप्लिकेशन का उपयोग कर रहे हैं, तो होस्टिंग सपोर्ट टीमों में लिक्विड वेब के सबसे मददगार इंसानों को कई टेबल-लॉकिंग बाधाओं का सामना करना पड़ा है। वर्डप्रेस, मैगेंटो और जूमला जैसे लोकप्रिय तृतीय-पक्ष एप्लिकेशन के अधिकांश उपयोगकर्ताओं को स्टोरेज इंजन पर एक सूचित निर्णय लेने के लिए अंतर्निहित डेटाबेस घटकों या कोड का सीमित ज्ञान है। इन सामग्री प्रबंधन प्रणालियों (सीएमएस) से अधिकांश टेबल-लॉकिंग बाधाओं को आम तौर पर साइट के लिए सभी तालिकाओं को डिफ़ॉल्ट MyISAM के बजाय InnoDB में बदलकर हल किया जाता है। यदि आप अपने सर्वर पर इन प्रकार के कई सीएमएस की मेजबानी कर रहे हैं, तो सभी नई तालिकाओं के लिए इनो डीबी का उपयोग करने के लिए MySQL में डिफ़ॉल्ट स्टोरेज इंजन को बदलना फायदेमंद होगा ताकि कोई भी नया टेबल इंस्टॉलेशन InnoDB के साथ शुरू हो।

डिफ़ॉल्ट संग्रहण इंजन सेट करना

default_storage_engine=InnoDB जोड़कर अपने डिफ़ॉल्ट स्टोरेज इंजन को InnoDB पर सेट करें करने के लिए [mysqld] सिस्टम कॉन्फ़िग फ़ाइल का अनुभाग यहाँ स्थित है: /etc/my.cnf. फ़ाइल में परिवर्तनों का पता लगाने के लिए सर्वर के लिए MySQL सेवा को पुनरारंभ करना आवश्यक है।

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

MyISAM और InnoDB के बीच सभी तालिकाओं को कनवर्ट करना

दुर्भाग्य से, MySQL में स्वाभाविक रूप से तालिकाओं को परिवर्तित करने का विकल्प नहीं होता है, प्रत्येक तालिका को अलग-अलग बदलने के लिए छोड़ दिया जाता है। लिक्विड वेब की सहायता टीम ने इस प्रक्रिया के लिए पालन करने में आसान रखरखाव योजना तैयार की है। स्क्रिप्ट, जिसे आप शेल एक्सेस (SSH) के माध्यम से आवश्यक सर्वर पर चला सकते हैं, स्टोरेज इंजन के बीच सभी तालिकाओं को बदल देगी।

डाउनटाइम होने की स्थिति में इस प्रकृति के बैच संचालन करते समय तदनुसार नोटप्लान करें। इस परिमाण के परिवर्तन को लागू करने से पहले अपने सभी MySQL डेटाबेस का बैकअप लेना सबसे अच्छा अभ्यास है, ऐसा करने से किसी भी डेटा हानि को रोकने के लिए एक आसान पुनर्प्राप्ति बिंदु प्रदान करता है।

चरण 1:  तैयारी

दिन के ऐसे समय पर शुरू करने की योजना बनाएं जब डाउनटाइम के कम से कम परिणाम होंगे। इस प्रक्रिया को स्वयं किसी डाउनटाइम की आवश्यकता नहीं है, हालांकि, अप्रत्याशित परिस्थितियों से उबरने के लिए डाउनटाइम आवश्यक हो सकता है।

चरण 2:  सभी डेटाबेस को एक फ़ाइल में बैकअप करें

नीचे दिया गया आदेश all-databases-backup.sqld नाम के सभी डेटाबेस का एकल फ़ाइल बैकअप बनाता है और रूपांतरण सफल होने के बाद इसे हटाया जा सकता है और कोई स्पष्ट समस्या नहीं है।
mysqldump --all-databases > all-databases-backup.sql

चरण 3:  मौजूदा टेबल इंजन को एक फाइल में रिकॉर्ड करें

table-engine-backup.sql नामक फ़ाइल में मौजूदा तालिका इंजनों को रिकॉर्ड करने के लिए निम्न स्क्रिप्ट चलाएँ . फिर आप इस फ़ाइल को बाद में "आयात" या "चलाना" कर सकते हैं, यदि आवश्यक हो तो अपने मूल इंजन में वापस कनवर्ट करने के लिए।

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

यदि आपको किसी भी कारण से टेबल इंजन को वापस लाने की आवश्यकता है, तो चलाएँ:
mysql < table-engine-backup.sql

चरण 4a:  MyISAM टेबल्स को InnoDB में बदलें

तालिका विफल होने पर भी नीचे दी गई कमांड आगे बढ़ेगी और आपको यह बताएगी कि कौन सी तालिकाएँ कनवर्ट करने में विफल रहीं। आउटपुट कन्वर्ट-to-innodb.log . नाम की फ़ाइल में सहेजा गया है बाद में समीक्षा के लिएw.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

चरण 4b:सभी InnoDB तालिकाओं को MyISAM में बदलें

तालिका विफल होने पर भी यह आदेश आगे बढ़ेगा और आपको यह बताएगा कि कौन सी तालिकाएँ कनवर्ट करने में विफल रहीं। आउटपुट convert-to-myisam.log . नामक फ़ाइल में भी सहेजा जाता है बाद की समीक्षा के लिए।

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

MyISAM और InnoDB के बीच एकल तालिका को कनवर्ट करना

निम्न आदेश बताते हैं कि एकल तालिका को कैसे परिवर्तित किया जाता है।

Noteडेटाबेस_नाम को उचित डेटाबेस नाम से और तालिका_नाम को सही तालिका नाम से बदलें। सुनिश्चित करें कि आगे बढ़ने से पहले आपके पास विचाराधीन तालिका का वैध बैकअप है।

एक फ़ाइल के लिए एकल तालिका का बैकअप लें
mysqldump database_name table_name > backup-table_name.sql

एकल तालिका को InnoDB में बदलें

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

एकल तालिका को MyISAM में बदलें:

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

इस श्रृंखला में हमारे अन्य लेख देखें, MySQL प्रदर्शन:लंबी क्वेरी की पहचान करना, अपने डेटाबेस में धीमी क्वेरी को इंगित करने के लिए। हमारे अगले लेख के लिए बने रहें जहां हम कैशिंग और अनुकूलन को कवर करेंगे।

<फ़ील्डसेट>श्रृंखला नेविगेशन<<पिछला लेखअगला लेख>>

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीडीओ ने वाइल्डकार्ड के साथ बयान तैयार किए

  2. MySQL में MIN() बनाम LEAST():क्या अंतर है?

  3. MySQL शेल का उपयोग करके तार्किक डेटाबेस बैकअप

  4. MySQL:वैकल्पिक तालिका यदि स्तंभ मौजूद नहीं है

  5. अल्पविराम से अलग जुड़ने और MySQL में सिंटैक्स पर जुड़ने में क्या अंतर है?