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


121

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


8
MySql का डुप्लीकेट : MyISAM बनाम Inno DB! , या आप अपनी पिक ले सकते हैं: stackoverflow.com/search?q=myisam+vs+innodb
OMG Ponies

यह डेटाबेस इंजन है ... kavoir.com/2009/09/…
Matthieu

क्या हम अपने डेटाबेस के लिए एक ही समय में दोनों भंडारण इंजन का उपयोग कर सकते हैं?
user130561

1
आप उन्हें विभिन्न तालिकाओं पर समवर्ती कर सकते हैं, लेकिन एक दी गई तालिका के लिए आपको यह चुनने की आवश्यकता होगी कि आप
किसका

जवाबों:


110

InnoDBऔर MYISAM, के लिए भंडारण इंजन हैं MySQL

ये दोनों उनके लॉकिंग कार्यान्वयन पर भिन्न हैं: InnoDBतालिका में विशेष पंक्ति को MyISAMलॉक करता है , और पूरी MySQLतालिका को लॉक करता है ।

आप DB में तालिका बनाते समय MYISAMया देकर प्रकार निर्दिष्ट कर सकते हैं InnoDB


स्पष्ट और सरल उत्तर।
वदिराज जहगीरदार

38

अच्छी तरह से देखिए

InnoDB और MyISAM

InnoDB MySQL के लिए एक स्टोरेज इंजन है, जिसे MySQL AB द्वारा वितरित सभी मौजूदा बायनेरिज़ में मानक के रूप में शामिल किया गया है। MySQL के साथ उपयोग के लिए उपलब्ध अन्य स्टोरेज इंजन पर इसकी मुख्य वृद्धि ACID- अनुपालन लेनदेन समर्थन है

MyISAM 5.5 1 से पहले MySQL रिलेशनल डेटाबेस मैनेजमेंट सिस्टम संस्करणों के लिए डिफ़ॉल्ट भंडारण इंजन है । यह पुराने ISAM कोड पर आधारित है लेकिन इसमें कई उपयोगी एक्सटेंशन हैं। MyISAM की प्रमुख कमी लेनदेन समर्थन की अनुपस्थिति है। MySQL 5.5 के संस्करण और अधिक से अधिक संदर्भात्मक अखंडता बाधाओं, और उच्च संगामता सुनिश्चित करने के लिए InnoDB इंजन पर स्विच किया गया है।


1
क्या हम अपने डेटाबेस के लिए एक ही समय में दोनों भंडारण इंजन का उपयोग कर सकते हैं?
user130561

2
आप कर सकते हैं, क्योंकि प्रत्येक तालिका के लिए आप एक अलग भंडारण इंजन को परिभाषित कर सकते हैं। एक और सवाल यह है कि अगर आपको चाहिए mysql प्रलेखन में इस विषय के बारे में कुछ स्पष्टीकरण दिए गए हैं।
नैनो 7

18

वे भंडारण इंजन हैं।

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

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

InnoDB: उपयोगकर्ता डेटा की सुरक्षा के लिए MySQL के लिए एक लेनदेन-सुरक्षित (ACID आज्ञाकारी) भंडारण इंजन है, जिसमें कमिट, रोलबैक और क्रैश-रिकवरी क्षमताएं हैं। InnoDB पंक्ति-स्तरीय लॉकिंग (मोटे दानेदार तालों के लिए वृद्धि के बिना) और ओरेकल-शैली के लगातार नॉनलॉकिंग रीडिंग बहु-उपयोगकर्ता संगति और प्रदर्शन को बढ़ाते हैं। InnoDB प्राथमिक कुंजियों के आधार पर सामान्य प्रश्नों के लिए I / O को कम करने के लिए संकुलित अनुक्रमित में उपयोगकर्ता डेटा संग्रहीत करता है। डेटा अखंडता बनाए रखने के लिए, InnoDB FOREIGN KEY संदर्भ-अखंडता बाधाओं का भी समर्थन करता है।


इसलिए जब हम MySQL स्थापित करते हैं, तो क्या हमें विशेष रूप से हमारे MySQL डेटाबेस के रूप में उपयोग करने के लिए कौन से स्टोरेज इंजन को निर्दिष्ट करने की आवश्यकता है?
user130561

3
जैसा कि मेरी पोस्ट में बताया गया है, डिफ़ॉल्ट MyISAM है। यदि आप INNODB जैसे एक अलग स्टोरेज इंजन की सुविधाओं का उपयोग करना चाहते हैं, तो हाँ आपको निर्दिष्ट करने की आवश्यकता होगी। यह स्थापित करने के दौरान नहीं किया जाता है, बल्कि प्रारंभिक तालिका निर्माण के दौरान किया जाता है।
15

3
लेकिन इसके अनुसार: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; डिफ़ॉल्ट इंजन InnoDB है।
हर्षा

2
Dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html के अनुसार : "डिफ़ॉल्ट इंजन InnoDB है MySQL 5.5.5 के रूप में (5.5.5 से पहले MyISAM)" तो डिफ़ॉल्ट इंजन अब है InnoDB। यह उत्तर डिफ़ॉल्ट इंजन के रूप में InnoDB के साथ पहली सामान्य-उपलब्धता रिलीज के 16 दिनों बाद पोस्ट किया गया था;)
SOFe

6

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

उस ने कहा, InnoDB हर समय बेहतर हो रही है:

InnoDB 1.1 प्रदर्शन और स्केलेबिलिटी एन्हांसमेंट


4

MyISAM ACID का अनुसरण नहीं करता है, क्योंकि InnoDB के विपरीत जो डेटा की अखंडता को बनाए रखने के लिए लेनदेन का अनुसरण करता है।

MyISAM समवर्ती आवेषण का समर्थन करता है: यदि किसी तालिका में डेटा फ़ाइल के बीच में कोई खाली ब्लॉक नहीं है, तो आप उसी समय नई पंक्तियों को सम्मिलित कर सकते हैं, जब तालिका से अन्य थ्रेड्स पढ़ रहे हों। MySqlDoc

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

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


3

InnoDB MySQL का एक ट्रांजेक्शनल स्टोरेज इंजन है, जबकि MyISAM एक नॉन-ट्रांजैक्शनल स्टोरेज इंजन है। दूसरे शब्दों में, InnoDB डेटा की अखंडता को बनाए रखने के लिए ACID गुणों का अनुसरण करता है, लेकिन MyISAM ACID गुणों का पालन नहीं करता है, इस प्रकार डेटा की अखंडता को बनाए रखने में विफल रहता है।

यदि कोई रोलबैक आवश्यक है, तो एक InnoDB (लेन-देन) तालिका में, लेन-देन में परिवर्तन आसानी से पूर्ववत किया जा सकता है। जब लेन-देन की आवश्यकता होती है तो MyISAM (गैर-लेन-देन) तालिका में किए गए परिवर्तन पूर्ववत नहीं किए जा सकते।

उदाहरण के लिए, आप अपने चेकिंग अकाउंट से सेविंग अकाउंट में पैसा ट्रांसफर करना चाहते हैं। यह एक लेनदेन द्वारा किया जाता है जिसमें 5 प्रश्न शामिल होते हैं।

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

मान लीजिए, यह प्रक्रिया चरण 4 पर दुर्घटनाग्रस्त हो जाती है। यदि यहां एक InnoDB तालिका का उपयोग किया गया था, तो एक रोलबैक परिवर्तनों को पूर्ववत कर देगा और आप पैसे खोने के जोखिम से बच जाते हैं। वास्तव में, तालिका किसी भी दुर्घटना से अनजान है क्योंकि जब तक चरण 5 को सफलतापूर्वक निष्पादित नहीं किया जाता है तब तक तालिका में परिवर्तन नहीं किया जाएगा।

माईसम तालिका के मामले में, कोई भी लेन-देन में कोई बदलाव नहीं कर सकता है या अगर कोई दुर्घटना होती है, तो लेन-देन की विफलता के कारण दुर्घटना हो सकती है। इसका मतलब है, यदि लेन-देन चरण 3 पर दुर्घटनाग्रस्त हो गया, तो आपके चेकिंग खाते से पैसे काट लिए जाएंगे। लेकिन पैसा आपके बचत खाते में नहीं जोड़ा जाता।

उदाहरण शिष्टाचार: "उच्च प्रदर्शन MySQL: अनुकूलन, बैकअप, और प्रतिकृति" - Arjen Lentz, डेरेक जे। बॉलिंग, जेरेमी Zawodny, पीटर Zaitsev, और वादिम Tkkenko द्वारा पुस्तक


1

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


0

InnoDB डिफ़ॉल्ट नहीं है myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html "InnoDB डिफ़ॉल्ट MySQL स्टोरेज इंजन है। जब तक कि आपने एक अलग डिफ़ॉल्ट भंडारण इंजन को कॉन्फ़िगर नहीं किया है, एक जारी करता है। एक इंजन = खण्ड के बिना TATE कथन बनाएँ एक InnoDB तालिका बनाता है "

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