InnoDB और MyISAM के बीच मुख्य अंतर क्या हैं?


245

InnoDB और MyISAM के बीच मुख्य अंतर क्या हैं?


23
यदि आप एक डेटाबेस इंजन चाहते हैं, तो InnoDB का उपयोग करें। आप दोनों की तुलना नहीं कर सकते
जेरेमी स्टीन

हालांकि नीचे दिए गए कई उत्तर सही हैं, वे चीजों को स्पष्ट रूप से उबालते नहीं हैं, आईएमएचओ। यह साइट करता है, और मुख्य बिंदु: InnoDB पंक्ति-स्तरीय लॉकिंग है, MyISAM तालिका-स्तरीय लॉकिंग है। इसका मतलब है, आम तौर पर बोलना, ओआईएसएपी (एनालिटिक्स, ज्यादातर पढ़ता है) के लिए माईसैम बेहतर होगा और ओएनटीपी (लेनदेन, ज्यादातर लिखता है, या कम से कम कई लिखता है) के लिए इनोबीडी बेहतर होगा।
माइक विलियमसन

जवाबों:


159

पहला बड़ा अंतर जो मैं देख रहा हूं वह यह है कि इनोबीडी पंक्ति-स्तरीय लॉक को लागू करता है जबकि MyISAM केवल टेबल-लेवल लॉक कर सकता है। आपको InnoDB में बेहतर क्रैश रिकवरी मिलेगी। हालाँकि, यह FULLTEXTv5.6 तक खोज अनुक्रमित नहीं है , जैसा कि MyISAM करता है। InnoDB भी लेनदेन को लागू करता है, विदेशी कुंजी और संबंध बाधाओं जबकि MyISAM नहीं करता है।

सूची थोड़ी और आगे बढ़ सकती है। फिर भी, वे दोनों अपने पक्ष में अपने अनूठे फायदे और एक दूसरे के खिलाफ नुकसान हैं। उनमें से प्रत्येक दूसरे की तुलना में कुछ परिदृश्यों में अधिक उपयुक्त है।

इसलिए संक्षेप में ( TL; DR ):

  • InnoDB में पंक्ति-स्तरीय लॉकिंग है, MyISAM केवल पूर्ण तालिका-स्तर लॉकिंग कर सकता है।
  • InnoDB में बेहतर क्रैश रिकवरी है।
  • MyISAM में FULLTEXTखोज सूचकांक हैं, InnoDB MySQL 5.6 (फरवरी 2013) तक नहीं था।
  • InnoDB लेनदेन, विदेशी कुंजी और संबंध की बाधाओं को लागू करता है, MyISAM नहीं करता है।

प्रिय महोदय, तो आखिरकार कोई क्या उपयोग करेगा? MyISAM या InnoDB? मैं पूरी तरह से भ्रमित हूँ ... मेरी वेबसाइट mysql का उपयोग कर रही है और मुझे यह तय करने की आवश्यकता है।
sqlchild

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

2
मैंने उनके पद को स्पष्टीकरण के लिए संपादित किया।
मथियास लिकेगार्ड लोरेंजेन

1
@MathiasLykkegaardLorenzen धन्यवाद, यही एक कारण है कि हम
स्टेक्सएक्सचेंज को

के रूप में version 5.6.4InnoDB FULLTEXTखोज का समर्थन करता है । dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
daydreamer

85

एक अन्य प्रमुख अंतर जो अभी तक उल्लेख नहीं किया गया है कि प्रत्येक भंडारण इंजन के लिए कैशिंग कैसे किया जाता है।

MyISAM

उपयोग किया जाने वाला मुख्य तंत्र कुंजी कैश है। यह केवल .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 तालिकाओं से डेटा और इंडेक्स पेजों को एक्सेस करता है। अपने 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) होनी चाहिए। सरलता के लिए, केवल दो लॉग फ़ाइलें दी गई हैं, यहां बताया गया है कि आप उन्हें कैसे आकार दे सकते हैं:

  • चरण 1) innodb_log_file_size = NNN को /etc/my.cnf में जोड़ें (NNN 25% innodb_buffer_pool_size या 2047M, जो भी छोटा हो) होना चाहिए
  • चरण 2) service mysql stop
  • चरण 3) rm /var/log/mysql/ib_logfile[01]
  • चरण 4) service mysql start(ib_logfile0 और ib_logfile1 फिर से बनाए गए हैं)

चेतावनी

दोनों प्रश्नों के अंत में एक इनलाइन क्वेरी (SELECT 2 PowerOf1024)बी है

  • (SELECT 0 PowerOf1024) बाइट्स में सेटिंग देता है
  • (SELECT 1 PowerOf1024) किलोबाइट्स में सेटिंग देता है
  • (SELECT 2 PowerOf1024) मेगाबाइट में सेटिंग देता है
  • (SELECT 3 PowerOf1024) गीगाबाइट्स में सेटिंग देता है
  • कोई भी शक्तियां कम नहीं है जो 0 या 3 से अधिक है

उपसंहार

सामान्य ज्ञान का कोई विकल्प नहीं है। यदि आपके पास सीमित मेमोरी है, तो भंडारण इंजनों का मिश्रण, या इसके संयोजन, आपको विभिन्न परिदृश्यों के लिए समायोजित करना होगा।

  • यदि आपके पास 2GB RAM और 16GB InnoDB है, तो 512M को innodb_buffer_pool के रूप में आवंटित करें।
  • यदि आपके पास 2GB RAM और 4GB का MyISAM इंडेक्स है, तो 512M को key_buffer_size के रूप में आवंटित करें।
  • यदि आपके पास 2GB RAM और 4GB MyISAM इंडेक्स और 16GB InnoDB है, तो 512M को key_buffer_size और 512M को innodb_buffer_pool_size के रूप में आवंटित करें।

संभावित परिदृश्य अनंत हैं !!!

याद रखें, जो भी आप के लिए आवंटित करते हैं, DB कनेक्शन और ऑपरेटिंग सिस्टम के लिए पर्याप्त RAM छोड़ दें।


वे बुरे सूत्र हैं!
रिक जेम्स

(उफ़ - भूल जाते हैं कि पैराग्राफ नहीं हो सकते) ... मैं एक "उत्तर" जोड़ूंगा।
रिक जेम्स

कैश आकार के लिए रोलैंडो के सूत्र व्यावहारिक नहीं हैं। - 2 की शक्तियों की जरूरत नहीं है। - 32-बिट OS पर 4GB असंभव है - आदि। यहाँ पर उन्हें सेट करने के लिए मेरा रंडाउन है: mysql.rjweb.org/doc.php/memory (यह स्मृति उपयोग को प्रभावित करने वाली विभिन्न अन्य सेटिंग्स को संबोधित करता है।)
रिक जेम्स

2
@ रिक: 2 की शक्तियां विभिन्न इकाइयों में उत्तर प्रदर्शित करने के लिए थीं। Doing (Select 2 PowerOfTwo) MB में उत्तर का प्रदर्शन सेट करता है। डूइंग (Select 3 PowerOfTwo) जीबी में डिस्प्ले सेट करता है। (SELECT 1 पॉवरऑफट्वो) KB में प्रदर्शित करता है। (सिलेक्ट 0 पॉवरऑफट्वो) बाइट्स में प्रदर्शित करता है। यही (Select 2 PowerOfTwo) करता है। तो यह केवल प्रदर्शन को समझने की जरूरत है, वास्तुकला में किसी भी मान्य मूल्यों को लागू न करें।
RolandoMySQLDBA

2
@ रिक: आप जानते हैं क्या? मैं वास्तव में आपको दो बहुत बड़े कारणों के लिए एक +1 दूंगा। 1) आपका URL पुष्टि करता है कि मेरा उत्तर सही था कि 4GB key_buffer_size को असाइन करने के लिए सबसे बड़ी संख्या है। 2) आपका उत्तर, आपके URL के साथ, मशीनों के लिए बहुत कम मेमोरी का अर्थ रखता है। जहां क्रेडिट बकाया है, मैं उसे क्रेडिट दूंगा।
RolandoMySQLDBA

60

InnoDB प्रदान करता है:

  • ACID लेनदेन
  • रो-लेवल लॉकिंग
  • विदेशी प्रमुख बाधाओं
  • स्वचालित दुर्घटना वसूली
  • तालिका संपीड़न (पढ़ें / लिखें)
  • स्थानिक डेटा प्रकार (कोई स्थानिक अनुक्रमित)

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उपयोग नहीं होता)
  • पूर्ण पाठ अनुक्रमण (अद्यतन: MySQL 5.6 से InnoDB में समर्थित)
  • छोटे डिस्क पदचिह्न
  • बहुत उच्च तालिका संपीड़न (केवल पढ़ने के लिए)
  • स्थानिक डेटा प्रकार और अनुक्रमित (आर-ट्री) (अपडेट: MySQL 5.7 से InnoDB में समर्थित)

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

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


5
मैंने आपका उत्तर पढ़ा और यहां पहले से मौजूद अन्य लोगों के साथ तुलना की। तुम्हारा केवल BLOBs का उल्लेख करने के लिए एक है। वे आम तौर पर दी गई हैं। तुम्हारा भी केवल एक ही है, जिसका उल्लेख मयसम्पैक है, जो कि तेजी से पढ़े जाने योग्य मयिसम तालिकाओं के अनसंग नायकों में से एक है। तुम्हारा आज एक +1 है !!!
RolandoMySQLDBA

2
उदाहरण एक संपीड़ित रीड-ओनली तालिका होगी जहाँ आपके पास तालिका को पूरी तरह से बदलकर इसके लिए अप्रासंगिक अद्यतन हैं।
dabest1

30

एक और बात: आप फाइल सिस्टम का केवल एक स्नैपशॉट लेकर इनोबीडी टेबल का बैकअप ले सकते हैं। MyISAM का बैकअप लेने के लिए mysqldump का उपयोग करने की आवश्यकता होती है और यह सुसंगत होने की गारंटी नहीं है (उदाहरण के लिए यदि आप माता-पिता और बच्चे की तालिका में सम्मिलित करते हैं, तो आपको अपने बैकअप में केवल बच्चे की तालिका की पंक्ति मिल सकती है)।

असल में, यदि आपके पास डेटा की एक और प्रति है और केवल इसे MySQL उदा में कैशिंग कर रहे हैं, तो इसे PHP वेबसाइट से एक्सेस करने का एक मानक साधन प्राप्त करने के लिए, तो MyISAM ठीक है (यानी यह फ्लैट CSV फ़ाइल या क्वेरी के लिए लॉगफ़ाइल से बेहतर है और समवर्ती पहुँच)। यदि डेटाबेस डेटा की वास्तविक "मास्टर कॉपी" है, यदि आप उपयोगकर्ताओं से वास्तविक डेटा का उपयोग कर रहे हैं INSERTऔर UPDATEकर रहे हैं , तो यह किसी भी तरह के पैमाने पर इनओडीबी के अलावा किसी भी तरह का उपयोग करना मूर्खतापूर्ण है, MyISAM अविश्वसनीय और प्रबंधन करने में कठिन है, आप ' myisamchkकिसी भी प्रदर्शन के लाभ को नकारते हुए, आधा समय कर लेंगे ...

(मेरा निजी अनुभव: MyISAM में एक 2 टेराबाइट डीबी)।


29

खेल में थोड़ा देर हो गई ... लेकिन यहाँ एक व्यापक पोस्ट मैंने कुछ महीने पहले लिखी थी , जिसमें 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 या अन्य डेटा प्रकार चुनें।


1
धन्यवाद, वास्तव में जानकारीपूर्ण और स्पष्ट सारांश।
informatik01

18

मेरे अनुभव में, सबसे महत्वपूर्ण अंतर है जिस तरह से प्रत्येक इंजन लॉकिंग को संभालता है। InnoDB रो लॉकिंग का उपयोग करता है जबकि MyISAM टेबल लॉकिंग का उपयोग करता है। अंगूठे के एक नियम के रूप में, मैं भारी टेबल लिखने के लिए InnoDB का उपयोग करता हूं और भारी तालिकाओं को पढ़ने के लिए MyISAM।

अन्य महत्वपूर्ण अंतरों में शामिल हैं:

  1. InnoDB लेनदेन और विदेशी कुंजी का समर्थन करता है। MyISAM नहीं करता है।
  2. MyISAM पूर्ण पाठ अनुक्रमण का उपयोग करता है।
  3. MyISAM डेटा अखंडता को लागू करने का एक खराब काम करता है।

आउट ऑफ़ डेट - अब InnoDB है FULLTEXTऔर SPATIAL। InnoDB पढ़ने और लिखने-भारी भार दोनों के लिए अच्छा है ।
रिक जेम्स

8

मैं MyISAM को MySQL के लिए 'डिफ़ॉल्ट' तालिका विकल्प के रूप में देखता हूं, इसलिए मैं InnoDB के अधिकांश उपयोगकर्ताओं के लिए मतभेदों को इंगित करूंगा

  • रो लेवल-लॉकिंग
  • विदेशी कुंजी प्रवर्तन
  • लेन-देन का समर्थन
  • उच्च-उपयोग प्रणालियों पर प्रदर्शन हिट

5
नवीनतम MySQL रिलीज को छोड़कर अब डिफ़ॉल्ट इंजन के रूप में MyISAM का उपयोग नहीं करता है। 5.5 में उन्होंने डिफॉल्ट को InnoDB में बदल दिया :)। और मैं इस सामान्यीकरण से असहमत होऊंगा कि सामान्य तौर पर InnoDB को केवल 'प्रदर्शन हिट' मिलता है। उचित इंडेक्सिंग और अच्छी तरह से कॉन्फ़िगर की गई मेमोरी सेटिंग्स के साथ अच्छी तरह से डिज़ाइन की गई InnoDB टेबल एक InnoDB टेबल प्रदर्शन के साथ-साथ MyISAM में एक ही स्कीमा बना सकती है
TechieGurl

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

2
InnoDB के लिए पूर्ण खोज को MySQL 5.6 विकास चक्र के माध्यम से जोड़ा गया था। अब उद्धृत URL में InnoDB को भी शामिल किया गया है।
मैक्स वेबस्टर

5

MyISAM

MYISAM तालिका स्तर लॉकिंग, पूर्ण खोज प्रदान करता है। MYISAM में सभी स्टोरेज इंजन को बंद करने वाला सबसे लचीला AUTO_INCREMENTED कॉलम है। MYISAM लेनदेन का समर्थन नहीं करता है।

InnoDB

INNODB सुरक्षित भंडारण इंजन है। INNODB में प्रतिबद्ध, रोलबैक और क्रैश-रिकवरी क्षमताएं हैं। INNODB विदेशी कुंजी संदर्भात्मक अखंडता का समर्थन करता है।


5

MySQL 5.6 परिवर्तन शामिल हैं

INNODB भंडारण इंजन:

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

तो, MyISAMइंजन का उपयोग करने का कोई मतलब नहीं है यदि आप पहले से ही 5.6 में अपग्रेड किए गए हैं, तो नहीं तो MySQL 5.6 में अपग्रेड होने का इंतजार न करें।

MySQL 5.6 का उपयोग करते हुए InnoDB VS MyISAM का प्रदर्शन


2

MyISAM

MyISAM MySQL का स्टोरेज इंजन है। MySQL 5.5 से पहले यह MySQL के लिए डिफ़ॉल्ट भंडारण इंजन था। यह पुराने ISAM स्टोरेज इंजन पर आधारित है। MyISAM भारी पढ़ने के संचालन के साथ वातावरण के लिए अनुकूलित है, और कुछ लिखते हैं, या कोई भी नहीं है। MyISAM को तेजी से पढ़ने के लिए अनुमति देने का कारण इसके अनुक्रमित की संरचना है: प्रत्येक प्रविष्टि डेटा फ़ाइल में एक रिकॉर्ड की ओर इशारा करती है, और सूचक फ़ाइल की शुरुआत से ऑफसेट है। इस तरह से रिकॉर्ड जल्दी से पढ़ा जा सकता है, खासकर जब प्रारूप FIXED है। इस प्रकार, पंक्तियाँ निरंतर लंबाई की हैं। एक विशिष्ट क्षेत्र जिसमें कोई MyISAM पसंद कर सकता है, वह है डेटा वेयरहाउस, क्योंकि इसमें बहुत बड़ी तालिकाओं पर प्रश्न शामिल होते हैं, और ऐसी तालिकाओं का अद्यतन तब किया जाता है जब डेटाबेस उपयोग में नहीं होता है (आमतौर पर रात तक)। सम्मिलित करना बहुत आसान है, क्योंकि डेटा फ़ाइल के अंत में नई पंक्तियों को जोड़ा जाता है। हालाँकि, डिलीट और अपडेट ऑपरेशंस अधिक समस्याग्रस्त हैं: डिलीट करने के लिए खाली जगह छोड़नी चाहिए, या पंक्तियों के ऑफ़सेट बदल जाएंगे; वही अपडेट के लिए जाता है, क्योंकि पंक्तियों की लंबाई छोटी हो जाती है; यदि अद्यतन पंक्ति को लंबा बनाता है, तो पंक्ति खंडित हो जाती है। पंक्तियों को डीफ़्रैग्मेन्ट करने और रिक्त स्थान का दावा करने के लिए,OPTIMIZE TABLEकमांड निष्पादित किया जाना चाहिए। इस सरल तंत्र के कारण, आमतौर पर MyISAM सूचकांक आँकड़े काफी सटीक होते हैं। MyISAM की अन्य प्रमुख कमियां लेनदेन समर्थन और विदेशी कुंजी की अनुपस्थिति हैं।

InnoDB

InnoDB MySQL का स्टोरेज इंजन है। MySQL 5.5 और बाद में इसे डिफ़ॉल्ट रूप से उपयोग करें। यह विदेशी कुंजी समर्थन (डिक्लेरेटिव रेफ़रेंशियल इंटिग्रिटी) के साथ मानक ACID-अनुरूप लेनदेन सुविधाएँ प्रदान करता है। यह FULLTEXTOpenGIS मानक के बाद SQL और XA लेनदेन, टेबलस्पेस, इंडेक्स और स्थानिक संचालन दोनों को लागू करता है। यह MySQL AB द्वारा वितरित अधिकांश बायनेरिज़ में मानक के रूप में शामिल है, अपवाद कुछ OEM संस्करण हैं। सॉफ्टवेयर ओरेकल कॉर्पोरेशन द्वारा दोहरी लाइसेंस वाला है; यह GNU जनरल पब्लिक लाइसेंस के तहत वितरित किया जाता है, लेकिन मालिकाना सॉफ़्टवेयर में InnoDB के संयोजन के इच्छुक दलों को भी लाइसेंस दिया जा सकता है।

फोर्क्स

मारियाडीबी में आरिया नामक एक भंडारण इंजन है, जिसे "मिज़ाम के लिए दुर्घटना-सुरक्षित विकल्प" के रूप में वर्णित किया गया है। मारियाडीबी और पर्कोना सर्वर इनोओडीबी के एक फोर्क का उपयोग करते हैं जिसे डिफ़ॉल्ट रूप से एक्स्ट्राबीडी कहा जाता है। XtraDB का रखरखाव पेरकोना द्वारा किया जाता है। Oracle InnoDB के परिवर्तन नियमित रूप से XtraDB में आयात किए जाते हैं, और कुछ बग फिक्स और अतिरिक्त सुविधाएं जोड़ी जाती हैं।

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