InnoDB और MyISAM के बीच मुख्य अंतर क्या हैं?
InnoDB और MyISAM के बीच मुख्य अंतर क्या हैं?
जवाबों:
पहला बड़ा अंतर जो मैं देख रहा हूं वह यह है कि इनोबीडी पंक्ति-स्तरीय लॉक को लागू करता है जबकि MyISAM केवल टेबल-लेवल लॉक कर सकता है। आपको InnoDB में बेहतर क्रैश रिकवरी मिलेगी। हालाँकि, यह FULLTEXT
v5.6 तक खोज अनुक्रमित नहीं है , जैसा कि MyISAM करता है। InnoDB भी लेनदेन को लागू करता है, विदेशी कुंजी और संबंध बाधाओं जबकि MyISAM नहीं करता है।
सूची थोड़ी और आगे बढ़ सकती है। फिर भी, वे दोनों अपने पक्ष में अपने अनूठे फायदे और एक दूसरे के खिलाफ नुकसान हैं। उनमें से प्रत्येक दूसरे की तुलना में कुछ परिदृश्यों में अधिक उपयुक्त है।
इसलिए संक्षेप में ( TL; DR ):
FULLTEXT
खोज सूचकांक हैं, InnoDB MySQL 5.6 (फरवरी 2013) तक नहीं था।version 5.6.4
InnoDB FULLTEXT
खोज का समर्थन करता है । dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
एक अन्य प्रमुख अंतर जो अभी तक उल्लेख नहीं किया गया है कि प्रत्येक भंडारण इंजन के लिए कैशिंग कैसे किया जाता है।
उपयोग किया जाने वाला मुख्य तंत्र कुंजी कैश है। यह केवल .MYI फ़ाइलों से अनुक्रमणिका पृष्ठों को कैश करता है। अपने कुंजी कैश को आकार देने के लिए, निम्नलिखित क्वेरी चलाएँ:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;
यह आपके वर्तमान डेटा सेट को दिए गए MyISAM Key Cache ( key_buffer_size ) के लिए अनुशंसित सेटिंग देगा ( क्वेरी 4G (4096M) पर अनुशंसा को कैप करेगा। 32-बिट OS के लिए, 4GB की सीमा है। 64-बिट, 8GB के लिए)
उपयोग किया जाने वाला मुख्य तंत्र इनोबीडी बफर पूल है। यह InnoDB तालिकाओं से डेटा और इंडेक्स पेजों को एक्सेस करता है। अपने InnoDB बफ़र पूल को आकार देने के लिए, निम्नलिखित क्वेरी चलाएँ:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
यह आपके वर्तमान डेटा सेट को दिए गए InnoDB बफर पूल ( innodb_buffer_pool_size ) के आकार के लिए अनुशंसित सेटिंग देगा ।
InnoDB लॉग फ़ाइलें (ib_logfile0 और ib_logfile1) का आकार बदलना न भूलें। MySQL Source Code सभी InnoDB लॉग फ़ाइलों के संयुक्त आकार की एक टोपी रखता है, जो <4G (4096M) होनी चाहिए। सरलता के लिए, केवल दो लॉग फ़ाइलें दी गई हैं, यहां बताया गया है कि आप उन्हें कैसे आकार दे सकते हैं:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 और ib_logfile1 फिर से बनाए गए हैं)दोनों प्रश्नों के अंत में एक इनलाइन क्वेरी
(SELECT 2 PowerOf1024)
बी है
(SELECT 0 PowerOf1024)
बाइट्स में सेटिंग देता है(SELECT 1 PowerOf1024)
किलोबाइट्स में सेटिंग देता है(SELECT 2 PowerOf1024)
मेगाबाइट में सेटिंग देता है(SELECT 3 PowerOf1024)
गीगाबाइट्स में सेटिंग देता हैसामान्य ज्ञान का कोई विकल्प नहीं है। यदि आपके पास सीमित मेमोरी है, तो भंडारण इंजनों का मिश्रण, या इसके संयोजन, आपको विभिन्न परिदृश्यों के लिए समायोजित करना होगा।
संभावित परिदृश्य अनंत हैं !!!
याद रखें, जो भी आप के लिए आवंटित करते हैं, DB कनेक्शन और ऑपरेटिंग सिस्टम के लिए पर्याप्त RAM छोड़ दें।
InnoDB प्रदान करता है:
InnoDB में TEXT और BLOB को छोड़कर एक पंक्ति में सभी डेटा 8,000 बाइट्स पर कब्जा कर सकते हैं। MySQL 5.6 (Feb 2013) तक InnoDB में पूर्ण पाठ अनुक्रमण उपलब्ध नहीं है। InnoDB में COUNT(*)
(जब WHERE
, GROUP BY
या JOIN
उपयोग नहीं किया जाता है) MyISAM की तुलना में धीमी निष्पादित करें क्योंकि पंक्ति गणना आंतरिक रूप से नहीं होती है। InnoDB एक फ़ाइल में डेटा और इंडेक्स दोनों को संग्रहीत करता है। InnoDB डेटा और इंडेक्स दोनों को कैश करने के लिए एक बफर पूल का उपयोग करता है।
MyISAM प्रदान करता है:
COUNT(*)
है (जब WHERE
, GROUP BY
या JOIN
उपयोग नहीं होता)MyISAM में टेबल-लेवल लॉकिंग है, लेकिन रो-लेवल लॉकिंग नहीं है। कोई लेन-देन नहीं। कोई स्वचालित क्रैश पुनर्प्राप्ति नहीं है, लेकिन यह मरम्मत तालिका की कार्यक्षमता प्रदान करता है। कोई विदेशी कुंजी बाधा नहीं। InnoDB तालिकाओं की तुलना में MyISAM टेबल आमतौर पर डिस्क पर आकार में अधिक कॉम्पैक्ट होती हैं। यदि आवश्यक हो तो Myisampack के साथ संपीड़ित करके MyISAM तालिकाओं को आकार में और भी कम किया जा सकता है, लेकिन केवल पढ़ने के लिए ही बनें। MyISAM एक फ़ाइल में अनुक्रमित करता है और दूसरे में डेटा। MyISAM, कैशिंग इंडेक्स के लिए कुंजी बफ़र्स का उपयोग करता है और ऑपरेटिंग सिस्टम के लिए डेटा कैशिंग प्रबंधन को छोड़ देता है।
कुल मिलाकर मैं सबसे अधिक प्रयोजनों के लिए InnoDB और केवल विशेष उपयोग के लिए MyISAM की सिफारिश करूंगा। InnoDB अब नए MySQL संस्करणों में डिफ़ॉल्ट इंजन है।
एक और बात: आप फाइल सिस्टम का केवल एक स्नैपशॉट लेकर इनोबीडी टेबल का बैकअप ले सकते हैं। MyISAM का बैकअप लेने के लिए mysqldump का उपयोग करने की आवश्यकता होती है और यह सुसंगत होने की गारंटी नहीं है (उदाहरण के लिए यदि आप माता-पिता और बच्चे की तालिका में सम्मिलित करते हैं, तो आपको अपने बैकअप में केवल बच्चे की तालिका की पंक्ति मिल सकती है)।
असल में, यदि आपके पास डेटा की एक और प्रति है और केवल इसे MySQL उदा में कैशिंग कर रहे हैं, तो इसे PHP वेबसाइट से एक्सेस करने का एक मानक साधन प्राप्त करने के लिए, तो MyISAM ठीक है (यानी यह फ्लैट CSV फ़ाइल या क्वेरी के लिए लॉगफ़ाइल से बेहतर है और समवर्ती पहुँच)। यदि डेटाबेस डेटा की वास्तविक "मास्टर कॉपी" है, यदि आप उपयोगकर्ताओं से वास्तविक डेटा का उपयोग कर रहे हैं INSERT
और UPDATE
कर रहे हैं , तो यह किसी भी तरह के पैमाने पर इनओडीबी के अलावा किसी भी तरह का उपयोग करना मूर्खतापूर्ण है, MyISAM अविश्वसनीय और प्रबंधन करने में कठिन है, आप ' myisamchk
किसी भी प्रदर्शन के लाभ को नकारते हुए, आधा समय कर लेंगे ...
(मेरा निजी अनुभव: MyISAM में एक 2 टेराबाइट डीबी)।
खेल में थोड़ा देर हो गई ... लेकिन यहाँ एक व्यापक पोस्ट मैंने कुछ महीने पहले लिखी थी , जिसमें MYISAM और InnoDB के बीच के प्रमुख अंतरों का वर्णन किया गया था। एक क्यूपा (और शायद एक बिस्किट) पकड़ो, और आनंद लो।
MyISAM और InnoDB के बीच मुख्य अंतर संदर्भात्मक अखंडता और लेनदेन में है। अन्य अंतर भी हैं जैसे कि लॉकिंग, रोलबैक और पूर्ण-पाठ खोजें।
प्रासंगिक अखंडता सुनिश्चित करती है कि तालिकाओं के बीच संबंध सुसंगत रहे। अधिक विशेष रूप से, इसका मतलब है जब एक तालिका (जैसे लिस्टिंग) में एक विदेशी कुंजी (जैसे उत्पाद आईडी) होती है, जो एक अलग तालिका (जैसे उत्पाद) की ओर इशारा करती है, जब इंगित या तालिका में अद्यतन या हटाए जाते हैं, तो ये परिवर्तन लिंकिंग के लिए कैस्केड किए जाते हैं तालिका। हमारे उदाहरण में, यदि किसी उत्पाद का नाम बदला गया है, तो लिंकिंग टेबल की विदेशी कुंजी भी अपडेट हो जाएगी; यदि किसी उत्पाद को 'उत्पाद' तालिका से हटा दिया जाता है, तो कोई प्रविष्टि जो हटाए गए प्रविष्टि को इंगित करती है, भी हटा दी जाएगी। इसके अलावा, किसी भी नई सूची में वैध, मौजूदा प्रविष्टि की ओर इशारा करने वाली विदेशी कुंजी होनी चाहिए।
InnoDB एक संबंधपरक DBMS (RDBMS) है और इस प्रकार इसमें संदर्भात्मक अखंडता है, जबकि MyISAM नहीं करता है।
तालिका में डेटा का चयन डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) स्टेटमेंट्स जैसे कि SELECT, INSERT, UPDATE और DELETE का उपयोग करके किया जाता है। एक लेनदेन समूह दो या दो से अधिक डीएमएल एक साथ काम की एक इकाई में बयान करता है, इसलिए या तो पूरी इकाई को लागू किया जाता है, या इसमें से कोई भी नहीं है।
MyISAM लेनदेन का समर्थन नहीं करता है जबकि InnoDB करता है।
यदि किसी ऑपरेशन को MyISAM तालिका का उपयोग करते समय बाधित किया जाता है, तो ऑपरेशन को तुरंत समाप्त कर दिया जाता है, और जो पंक्तियाँ (या प्रत्येक पंक्ति के भीतर डेटा) प्रभावित होती हैं वे प्रभावित बनी रहती हैं, भले ही ऑपरेशन पूरा होने पर नहीं गया हो।
यदि एक InnoDB तालिका का उपयोग करते समय एक ऑपरेशन बाधित होता है, क्योंकि यह लेनदेन का उपयोग करता है, जिसमें परमाणुता है, कोई भी लेनदेन जो पूरा नहीं हुआ, वह प्रभावी नहीं होगा, क्योंकि कोई प्रतिबद्ध नहीं है।
जब कोई क्वेरी MyISAM तालिका के विरुद्ध चलती है, तो जिस तालिका में वह क्वेरी कर रहा है, वह पूरी लॉक हो जाएगी। इसका मतलब है कि बाद के प्रश्नों को केवल एक के समाप्त होने के बाद निष्पादित किया जाएगा। यदि आप एक बड़ी तालिका पढ़ रहे हैं, और / या लगातार पढ़ने और लिखने के काम कर रहे हैं, तो इसका मतलब प्रश्नों का एक विशाल बैकलॉग हो सकता है।
जब एक InnoDB तालिका के खिलाफ एक क्वेरी चलती है, केवल पंक्ति (s) जो कि शामिल होती हैं, लॉक होती हैं, तो बाकी तालिका CRUD संचालन के लिए उपलब्ध रहती है। इसका मतलब है कि क्वेरी एक ही टेबल पर एक साथ चल सकती हैं, बशर्ते वे एक ही पंक्ति का उपयोग न करें।
InnoDB में इस सुविधा को संगामिति के रूप में जाना जाता है। समसामयिक के रूप में महान के रूप में, वहाँ एक बड़ी खामी है कि तालिकाओं की एक चुनिंदा सीमा पर लागू होता है, उस में कर्नेल थ्रेड्स के बीच स्विच करने में एक ओवरहेड है, और सर्वर को रोकने के लिए आने से रोकने के लिए आपको कर्नेल थ्रेड्स पर एक सीमा निर्धारित करनी चाहिए। ।
जब आप MyISAM में एक ऑपरेशन चलाते हैं, तो परिवर्तन निर्धारित किए जाते हैं; InnoDB में, उन परिवर्तनों को वापस लाया जा सकता है। लेन-देन को नियंत्रित करने के लिए उपयोग किए जाने वाले सबसे सामान्य आदेश COMMIT, ROLLBACK और SAVEPOINT हैं। 1. कमिट - आप कई डीएमएल संचालन लिख सकते हैं, लेकिन परिवर्तन केवल तभी किया जाएगा जब एक कमिट बनाया जाता है। 2. रोलबैक - आप अभी तक अभी तक प्रतिबद्ध नहीं किए गए किसी भी संचालन को त्याग सकते हैं। 3. बचत - की सूची में एक बिंदु सेट करता है ऑपरेशन जिसके लिए एक रोलबैक ऑपरेशन को रोलबैक किया जा सकता है
MyISAM कोई डेटा अखंडता प्रदान नहीं करता है - हार्डवेयर विफलताओं, अशुद्ध शटडाउन और रद्द किए गए संचालन के कारण डेटा दूषित हो सकता है। इसके लिए अनुक्रमणिका और तालिकाओं की पूर्ण मरम्मत या पुनर्निर्माण की आवश्यकता होगी।
दूसरी ओर, InnoDB, भ्रष्टाचार को रोकने के लिए एक ट्रांजेक्शनल लॉग, एक डबल-राइट बफर और स्वचालित चेकसमिंग और सत्यापन का उपयोग करता है। इससे पहले कि InnoDB कोई परिवर्तन करता है, यह ibdata1 नामक एक सिस्टम टेबलस्पेस फ़ाइल में लेनदेन से पहले डेटा रिकॉर्ड करता है। यदि कोई दुर्घटना होती है, तो इन लॉग्स के रिप्ले के माध्यम से इनोबीडी ऑटोरेकवर होगा।
InnoDB MySQL संस्करण 5.6.4 तक फुलटेक्ट इंडेक्सिंग का समर्थन नहीं करता है। इस पोस्ट के लेखन के रूप में, कई साझा होस्टिंग प्रदाता 'MySQL संस्करण अभी भी 5.6.4 से नीचे है, जिसका अर्थ है कि FULLTEXT इंडेक्सिंग InnoDB तालिकाओं के लिए समर्थित नहीं है।
हालाँकि, यह MyISAM का उपयोग करने का एक वैध कारण नहीं है। यह एक होस्टिंग प्रदाता में बदलने के लिए सबसे अच्छा है जो MySQL के अद्यतित संस्करणों का समर्थन करता है। ऐसा नहीं है कि FISTEXT अनुक्रमणिका का उपयोग करने वाली एक MyISAM तालिका को एक InnoDB तालिका में परिवर्तित नहीं किया जा सकता है।
अंत में, InnoDB पसंद का आपका डिफ़ॉल्ट भंडारण इंजन होना चाहिए। जब वे विशिष्ट आवश्यकता की पूर्ति करते हैं तो MyISAM या अन्य डेटा प्रकार चुनें।
मेरे अनुभव में, सबसे महत्वपूर्ण अंतर है जिस तरह से प्रत्येक इंजन लॉकिंग को संभालता है। InnoDB रो लॉकिंग का उपयोग करता है जबकि MyISAM टेबल लॉकिंग का उपयोग करता है। अंगूठे के एक नियम के रूप में, मैं भारी टेबल लिखने के लिए InnoDB का उपयोग करता हूं और भारी तालिकाओं को पढ़ने के लिए MyISAM।
अन्य महत्वपूर्ण अंतरों में शामिल हैं:
FULLTEXT
और SPATIAL
। InnoDB पढ़ने और लिखने-भारी भार दोनों के लिए अच्छा है ।
मैं MyISAM को MySQL के लिए 'डिफ़ॉल्ट' तालिका विकल्प के रूप में देखता हूं, इसलिए मैं InnoDB के अधिकांश उपयोगकर्ताओं के लिए मतभेदों को इंगित करूंगा
MyISAM
MYISAM तालिका स्तर लॉकिंग, पूर्ण खोज प्रदान करता है। MYISAM में सभी स्टोरेज इंजन को बंद करने वाला सबसे लचीला AUTO_INCREMENTED कॉलम है। MYISAM लेनदेन का समर्थन नहीं करता है।
InnoDB
INNODB सुरक्षित भंडारण इंजन है। INNODB में प्रतिबद्ध, रोलबैक और क्रैश-रिकवरी क्षमताएं हैं। INNODB विदेशी कुंजी संदर्भात्मक अखंडता का समर्थन करता है।
MySQL 5.6 परिवर्तन शामिल हैं
INNODB भंडारण इंजन:
तो, MyISAM
इंजन का उपयोग करने का कोई मतलब नहीं है यदि आप पहले से ही 5.6 में अपग्रेड किए गए हैं, तो नहीं तो MySQL 5.6 में अपग्रेड होने का इंतजार न करें।
MyISAM MySQL का स्टोरेज इंजन है। MySQL 5.5 से पहले यह MySQL के लिए डिफ़ॉल्ट भंडारण इंजन था। यह पुराने ISAM स्टोरेज इंजन पर आधारित है। MyISAM भारी पढ़ने के संचालन के साथ वातावरण के लिए अनुकूलित है, और कुछ लिखते हैं, या कोई भी नहीं है। MyISAM को तेजी से पढ़ने के लिए अनुमति देने का कारण इसके अनुक्रमित की संरचना है: प्रत्येक प्रविष्टि डेटा फ़ाइल में एक रिकॉर्ड की ओर इशारा करती है, और सूचक फ़ाइल की शुरुआत से ऑफसेट है। इस तरह से रिकॉर्ड जल्दी से पढ़ा जा सकता है, खासकर जब प्रारूप FIXED है। इस प्रकार, पंक्तियाँ निरंतर लंबाई की हैं। एक विशिष्ट क्षेत्र जिसमें कोई MyISAM पसंद कर सकता है, वह है डेटा वेयरहाउस, क्योंकि इसमें बहुत बड़ी तालिकाओं पर प्रश्न शामिल होते हैं, और ऐसी तालिकाओं का अद्यतन तब किया जाता है जब डेटाबेस उपयोग में नहीं होता है (आमतौर पर रात तक)। सम्मिलित करना बहुत आसान है, क्योंकि डेटा फ़ाइल के अंत में नई पंक्तियों को जोड़ा जाता है। हालाँकि, डिलीट और अपडेट ऑपरेशंस अधिक समस्याग्रस्त हैं: डिलीट करने के लिए खाली जगह छोड़नी चाहिए, या पंक्तियों के ऑफ़सेट बदल जाएंगे; वही अपडेट के लिए जाता है, क्योंकि पंक्तियों की लंबाई छोटी हो जाती है; यदि अद्यतन पंक्ति को लंबा बनाता है, तो पंक्ति खंडित हो जाती है। पंक्तियों को डीफ़्रैग्मेन्ट करने और रिक्त स्थान का दावा करने के लिए,OPTIMIZE TABLE
कमांड निष्पादित किया जाना चाहिए। इस सरल तंत्र के कारण, आमतौर पर MyISAM सूचकांक आँकड़े काफी सटीक होते हैं। MyISAM की अन्य प्रमुख कमियां लेनदेन समर्थन और विदेशी कुंजी की अनुपस्थिति हैं।
InnoDB MySQL का स्टोरेज इंजन है। MySQL 5.5 और बाद में इसे डिफ़ॉल्ट रूप से उपयोग करें। यह विदेशी कुंजी समर्थन (डिक्लेरेटिव रेफ़रेंशियल इंटिग्रिटी) के साथ मानक ACID-अनुरूप लेनदेन सुविधाएँ प्रदान करता है। यह FULLTEXT
OpenGIS मानक के बाद SQL और XA लेनदेन, टेबलस्पेस, इंडेक्स और स्थानिक संचालन दोनों को लागू करता है। यह MySQL AB द्वारा वितरित अधिकांश बायनेरिज़ में मानक के रूप में शामिल है, अपवाद कुछ OEM संस्करण हैं। सॉफ्टवेयर ओरेकल कॉर्पोरेशन द्वारा दोहरी लाइसेंस वाला है; यह GNU जनरल पब्लिक लाइसेंस के तहत वितरित किया जाता है, लेकिन मालिकाना सॉफ़्टवेयर में InnoDB के संयोजन के इच्छुक दलों को भी लाइसेंस दिया जा सकता है।
मारियाडीबी में आरिया नामक एक भंडारण इंजन है, जिसे "मिज़ाम के लिए दुर्घटना-सुरक्षित विकल्प" के रूप में वर्णित किया गया है। मारियाडीबी और पर्कोना सर्वर इनोओडीबी के एक फोर्क का उपयोग करते हैं जिसे डिफ़ॉल्ट रूप से एक्स्ट्राबीडी कहा जाता है। XtraDB का रखरखाव पेरकोना द्वारा किया जाता है। Oracle InnoDB के परिवर्तन नियमित रूप से XtraDB में आयात किए जाते हैं, और कुछ बग फिक्स और अतिरिक्त सुविधाएं जोड़ी जाती हैं।