InnoDB और MyISAM में क्या अंतर है?


17

मैं अपने वर्तमान वेब प्रोजेक्ट के लिए MySQL को अपने डेटाबेस के रूप में उपयोग कर रहा हूं। मैं MySQL में नया हूं। कृपया मुझे InnoDB और MyISAM के बीच का अंतर समझाएं।


एक MySQL टैग के रूप में अच्छी तरह से जोड़ने के लिए स्वतंत्र महसूस :)
जोहान

यह stackoverflow पर नहीं है?
ripper234

@ ripper234। इस पोस्ट के दो बेहतर संस्करण (बहुत अधिक पृष्ठभूमि, पूर्व अनुसंधान के अधिक प्रदर्शन) SO पर मौजूद हैं: stackoverflow.com/q/12614541/209139 और stackoverflow.com/q/20148/209139
टीआरआईजी

जवाबों:


14

आईएसएएम = अनुक्रमित अनुक्रमिक विधि और अनिवार्य रूप से एक फ्लैट फ़ाइल है (उन डीबीए के लिए, जो बीट्रीव, या बी-ट्री को याद कर सकते हैं)। यह एक बहुत पुरानी तकनीक है - लेकिन इसका इस्तेमाल करने से मना न करें। क्योंकि यह एक सपाट फ़ाइल है (बाद में उस पर अधिक), यह संबंधपरक नहीं है, और इस तरह आरडीबीएमएस नहीं है, और इस प्रकार कुछ स्थितियों में अधिक उपयुक्त है।

InnoDB पूर्ण RDBMS है जैसे आप सबसे अधिक परिचित हैं। MyISAM आपके लिंक, तर्क और संदर्भात्मक अखंडता को बनाए रखने वाली शीर्ष पर जोड़ी गई एक और परत के माध्यम से संबंधपरक प्रतीत हो सकता है।

ISAM शानदार है अगर आपके पास बहुत सारे रिकॉर्ड हैं (जैसे, 20 मिलियन), और रिकॉर्ड ज्यादातर स्टैंड-अलोन हैं (यानी आपको संबंधित डेटा को पुनः प्राप्त करने के लिए बहुत सारे लिंक करने की आवश्यकता नहीं है)। यह बहुत भारी सूचकांक पर निर्भर करता है और यदि आपके पास सही सूचकांक नहीं है, तो बहुत लंबे क्वेरी समय के लिए तैयार रहें। बिंदु में मामला: हमारे पास 20M + रिकॉर्ड के साथ एक Btrieve ISAM तालिका थी और एक सटीक सूचकांक पर आधारित डेटा को पुनः प्राप्त करने और फ़िल्टर करने के लिए लगभग तुरंत था। गलत सूचकांक का उपयोग करना सचमुच 15 मिनट था।

यदि आपके पास बहुत सारे संबंधपरक लिंक हैं, तो InnoDB बहुत अच्छा है। तालिका A तालिका तालिका में एक फ़ील्ड का संदर्भ देती है, जो तालिका C और D. InnoDB का संदर्भ लेती है, जो सभी प्रकार की अच्छी जॉइनिंग विधियों (हैश जॉन्स, इत्यादि) का उपयोग करके इन रिकॉर्डों को प्राप्त कर सकती है, जबकि एक ISAM डेटाबेस को हर एक के लिए कई उप-प्रश्न चलाने होंगे। पंक्ति और रिकॉर्ड को मैन्युअल रूप से मिलाएं।

यदि आप उससे अधिक विवरण चाहते हैं तो आपको वास्तव में डेटाबेस में एक कोर्स करना होगा!


ISAM किसी अन्य चीज़ की तरह ही संबंधपरक है, यह इसके लिए अनुकूलित नहीं है।
लैपटॉप 006

धन्यवाद 4 आपका संक्षिप्त विवरण। अब मूल रूप से मुझे साफ़ कर दिया गया है

5

सबसे मौलिक यह है कि InnoDB ट्रांसेक्शनल है। MyIsam नहीं है। MyIsam आम तौर पर थोड़ा तेज़ होता है, इसलिए यदि आपको लेनदेन की ज़रूरत नहीं है जो आम तौर पर आपका सबसे अच्छा दांव है। विस्तृत विवरण के लिए आपको MySQL प्रलेखन पढ़ना चाहिए।


2

इन दिनों जब तक आप लॉग स्टाइल डेटा के लिए एक तालिका का उपयोग नहीं कर रहे हैं (कई और INSERT की तो SELECT की, कोई लेनदेन नहीं) InnoDB आमतौर पर तेज़, अधिक विश्वसनीय, अधिक सुविधाएँ, आदि हैं।

MyISAM की एकमात्र अन्य विशेषता पूर्ण खोज है जो बुनियादी उपयोग के लिए ठीक है, लेकिन ज्यादातर लोग ल्यूसिने से कुछ का उपयोग गंभीर रूप से करते हैं।

किसी भी तरह से आपको MySQL को ट्यून करना होगा क्योंकि डिफॉल्ट्स अनिवार्य रूप से एक 32MB पेंटियम के लिए सेट होते हैं जिसे अन्य सेवाओं के साथ साझा किया जाता है।


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, रोलबैक और SAVEPOINT हैं। 1. कमिट - आप कई डीएमएल संचालन लिख सकते हैं, लेकिन बदलाव केवल तभी किया जाएगा जब एक कमिट बनाया गया है। 2. रोलबैक - आप किसी भी ऐसे ऑपरेशन को छोड़ सकते हैं जो अभी तक प्रतिबद्ध नहीं हैं। 3. बचत - की सूची में एक बिंदु सेट करता है। ऑपरेशन जिसके लिए एक रोलबैक ऑपरेशन को रोलबैक किया जा सकता है

विश्वसनीयता

MyISAM कोई डेटा अखंडता प्रदान नहीं करता है - हार्डवेयर विफलताओं, अशुद्ध शटडाउन और रद्द किए गए संचालन के कारण डेटा दूषित हो सकता है। इसके लिए अनुक्रमणिका और तालिकाओं की पूर्ण मरम्मत या पुनर्निर्माण की आवश्यकता होगी।

दूसरी ओर, InnoDB, भ्रष्टाचार को रोकने के लिए एक ट्रांजेक्शनल लॉग, एक डबल-राइट बफर और स्वचालित चेकसमिंग और सत्यापन का उपयोग करता है। इससे पहले कि InnoDB कोई भी बदलाव करता है, यह लेनदेन से पहले डेटा को एक सिस्टम टेबलस्पेस फ़ाइल में दर्ज करता है जिसे ibdata1 कहा जाता है। यदि कोई दुर्घटना होती है, तो इन लॉग्स के रिप्ले के माध्यम से इनोबीडी ऑटोरोवर होगा।

पूर्ण अनुक्रमण

InnoDB MySQL संस्करण 5.6.4 तक FULLTEXT अनुक्रमण का समर्थन नहीं करता है। इस पोस्ट के लेखन के रूप में, कई साझा होस्टिंग प्रदाता 'MySQL संस्करण अभी भी 5.6.4 से नीचे है, जिसका अर्थ है कि FULLTEXT इंडेक्सिंग InnoDB तालिकाओं के लिए समर्थित नहीं है।

हालाँकि, यह MyISAM का उपयोग करने का एक वैध कारण नहीं है। यह एक होस्टिंग प्रदाता में बदलने के लिए सबसे अच्छा है जो MySQL के अद्यतित संस्करणों का समर्थन करता है। ऐसा नहीं है कि FISTEXT अनुक्रमणिका का उपयोग करने वाली एक MyISAM तालिका को एक InnoDB तालिका में परिवर्तित नहीं किया जा सकता है।

निष्कर्ष

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


1

आम तौर पर, अंगूठे का नियम है, यदि आप गति चाहते हैं, तो MyISAM का उपयोग करें और यदि आप स्थिरता चाहते हैं, तो InnoDB का उपयोग करें। अगर मुझे सही तरीके से याद है तो एटमॉसिटी के साथ कुछ करना।


3
वास्तव में यह सच नहीं है, वास्तव में ज्यादातर मामलों में InnoDB तेज है।
लैपटॉप 006

1
क्या कोई लिंक कुछ बेंचमार्क या कुछ और जोड़ सकता है ...?
जोहान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.