2009-07-04 8 views
11

मैं चोट लगने वाले here द्वारा उलझन में हूं।जब आप MySQL में InnoDB का उपयोग करना चुनते हैं?

मुझे पता है कि उन्हें कैसे करना है, नीचे देखें, लेकिन कोई विचार नहीं? यह किस लिए हैं?

create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB; 


create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)); 
+1

आपका उदाहरण विदेशी कुंजी कर रहा है, innodb नहीं। आपको पूछा जाना चाहिए कि विदेशी कुंजी क्या हैं। –

+1

क्या "चोट लगाना" है? यह लेख एक अनजान ड्रॉप डाटाबेस से पुनर्प्राप्त करने के बारे में है। –

+0

जिम फेरेंस: मैंने वाक्य को दोबारा प्रस्तुत किया: "यदि आप दृढ़ता से अनुभवी प्रोग्रामर नहीं हैं, तो आप को चोट पहुंचाने जा रहे हैं।" –

उत्तर

16

इनो डीबी storage engine in MySQL है। उनमें से कुछ हैं, और उनके सभी के पास उनके पेशेवर और विपक्ष हैं। InnoDB की सबसे बड़ी ताकत हैं: लेन-देन के लिए

  • समर्थन (आप दे ACID संपत्ति के लिए समर्थन)।
  • पंक्ति-स्तर लॉकिंग। अधिक बढ़िया अनाज लॉकिंग-तंत्र होने के कारण, उदाहरण के लिए, MyISAM की तुलना में आपको उच्च समेकन देता है।
  • विदेशी कुंजी बाधाएं। डेटाबेस को डेटाबेस की स्थिति की अखंडता सुनिश्चित करने और तालिकाओं के बीच संबंध सुनिश्चित करने के लिए आपको अनुमति देना।
2

हर जगह! मायिसम को कम करें, innodb जाने का रास्ता है। न केवल प्रदर्शन के बारे में है, बल्कि डेटा अखंडता और एसिड लेनदेन।

+0

एसीआईडी ​​लेनदेन की हमेशा आवश्यकता नहीं होती है इसलिए कई मामलों में MyISAM बहुत अच्छा है। विभिन्न समस्याओं के लिए अलग-अलग समाधान हैं। लेख और बैकअप के लिए – Nin

2

आपके उदाहरण में, आप विदेशी कुंजी बनाते हैं। विदेशी कुंजी केवल आईओएसडीबी टेबल के लिए समर्थित हैं, न कि माईसाम टेबल के लिए।

2

आपको डेटाबेस जर्नल से this article में रुचि हो सकती है जो MySQL तालिका प्रकार MySQL में चर्चा करता है।

अंश:

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

मुझे दूसरे प्रश्न से नहीं हटाया जाएगा। किसी भी प्रकार के अपने डेटाबेस के उचित बैकअप रखें - और दुर्घटनाओं से तालिकाओं को न छोड़ें ;-) - और आप जो भी टेबल प्रकार चुनते हैं वह ठीक रहेगा।

+0

+1 –

1

मेरे लिए सामान्य रूप से सबसे महत्वपूर्ण बात यह है कि InnoDB प्रति पंक्ति लॉकिंग प्रदान करता है, जबकि माईसैम प्रति तालिका देखता है। बहुत सारे लेखन के साथ बड़ी तालिकाओं पर यह एक बड़ा प्रदर्शन मुद्दा बना सकता है।

दूसरी ओर MyISAM तालिका में एक आसान फ़ाइल संरचना है, फ़ाइल स्तर पर तालिका की प्रतिलिपि बनाना और मरम्मत करना आसान है।

+0

व्यक्तिगत परिप्रेक्ष्य के लिए +1 –

+0

कितना माना जाता है? प्रति सेकंड एक लिखना बहुत है? –

+0

@EvanLee यह निर्भर करता है :) विशेष रूप से आप कितना डेटा लिखते हैं, क्रमशः लिखने के संचालन में कितना समय लगता है। लेकिन सामान्य रूप से: नहीं! – leo

12

हमेशा। जब तक आप MySQL की पूर्ण-पाठ खोज या InnoDB का उपयोग अपने साझा वेबहोस्ट में अक्षम नहीं करते हैं।

+0

यह सबसे आसान जवाब है और यह सच है! – JohnB

+1

एफवाईआई इनो डीबी अब पूर्ण-पाठ खोज का समर्थन करता है। इसके अलावा, इनो डीबीबी जितना तेज था उतना तेज था। इसलिए, माईसाम का उपयोग करने के लिए शायद ही कभी कोई कारण नहीं है * (यही कारण है कि InnoDB अब MySQL में डिफ़ॉल्ट इंजन है) * –

0

Machine के लिए एक पूरक और लेन-देन के बारे में knoopx के जवाब:

डिफ़ॉल्ट MySQL तालिका प्रकार, MyISAM, लेनदेन का समर्थन नहीं करता। BerkeleyDB और InnoDB लेन-देन-सुरक्षित तालिका प्रकार ओपन सोर्स MySQL, संस्करण 3.23.34 और अधिक में उपलब्ध हैं।

लेन-देन की परिभाषा और एक बैंकिंग उदाहरण

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

Source of the citations

1

एक टिप्पणी एक कमांड InnoDB के लिए अपने डेटाबेस कन्वर्ट करने के लिए है here.

3

मुझे लगता है कि आप दो अलग अलग मुद्दों, जब जब विदेशी उपयोग करने के लिए MyISAM के बजाय InnoDB उपयोग करने के लिए, और के बारे में उलझन में हैं कुंजी (एफके) बाधाएं।

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

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

मामले में आप क्यों इस तरह के उदाहरण के लिए id_orderorders तालिका के पी का मतलब है कि MySQL आप INSERTid_order का एक ही मूल्य नहीं दूँगी के रूप में प्राथमिक कुंजी (पी) का उपयोग करने, किसी स्तंभ बनाने पर स्पष्ट नहीं हैं एक से अधिक बार क्योंकि पीके कॉलम में प्रत्येक पंक्ति अद्वितीय होनी चाहिए।

एक एफके का उपयोग उस तालिका पर किया जाएगा जिस पर दूसरी तालिका पर निर्भरता है, उदाहरण के लिए, order_items पर orders (नीचे) पर निर्भरता होगी। id_order_itemsorder_items का पीके है और orders और order_items के बीच एक से अधिक रिश्तों को स्थापित करने के लिए आप id_order_itemsorders तालिका का एफके बना सकते हैं। इसी तरह, order_items तालिका में 0Kतालिका में एक पीके हो सकता है ताकि order_items और items के बीच एक से अधिक रिश्तों को स्थापित किया जा सके।

** फिर, क्या FK बाधा करता है एक id_item value to the order_items table that isn't in the आइटम table, or from adding a id_order_items to आदेश that isn't in the order_items `तालिका जोड़ने से रोक रहा है।

सभी एफके बीमा डेटा अखंडता बीमा करते हैं, और यह आपके टेबल के बीच संबंधों को अन्य डेवलपर्स को भी व्यक्त करने में मदद करता है जो सिस्टम नहीं लिखते हैं (और बाद में महीनों बाद जब आप भूल जाते हैं!), लेकिन मुख्य रूप से यह डेटा अखंडता के लिए है। **

अतिरिक्त क्रेडिट: तो लेनदेन का उपयोग क्यों करें? ठीक है आप पहले से ही एक उद्धरण का उल्लेख करते हैं जो कहता है कि वे बैंकिंग प्रणाली के लिए उपयोगी हैं, लेकिन वे उससे अधिक स्थितियों में उपयोगी हैं।

असल में, एक रिलेशनल डेटाबेस में, विशेष रूप से यदि यह normalized है, तो ऑर्डर जोड़ने, ऑर्डर अपडेट करने या ऑर्डर हटाने जैसे नियमित ऑपरेशन अक्सर 1 से अधिक टेबल को स्पर्श करता है और/या एक से अधिक SQL कथन शामिल होता है। आप एक ही टेबल को कई बार स्पर्श कर सकते हैं (जैसा कि नीचे दिया गया उदाहरण है)। बीटीडब्ल्यू डाटा मैनिपुलेशन लैंग्वेज (डीएमएल) कथन (INSERT/UPDATE/DELETE) केवल एक समय में एक टेबल शामिल है।

एक आदेश जोड़ने का एक उदाहरण:

मैं एक orders मेज और एक order_items तालिका सलाह देते हैं। इससे orders तालिका में id_order पर पीके हो सकता है, जिसका अर्थ है id_orderorders में दोहराया नहीं जा सकता है। 1 से कई orders - order_items रिलेशनशिप के बिना, आपको orders तालिका में कई पंक्तियां मिलनी होंगी जिनके साथ कई आइटम थे (आपको इस ई-कॉमर्स सिस्टम बीटीडब्ल्यू के लिए items तालिका भी चाहिए)। यह उदाहरण एक ऑर्डर जोड़ने जा रहा है और 4 अलग-अलग INSERT कथन के साथ ऐसा करने में 2 टेबल स्पर्श करें।

(समझाने के उद्देश्य से कोई कुंजी की कमी)

-- insert #1 
INSERT INTO orders (id_order, id_order_items, id_customer) 
VALUES (100, 150, 1) 

-- insert #2 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 1) 

-- insert #3 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 2) 

-- insert #4 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 3)

तो क्या हुआ अगर डालने # 1 और डालने # 2 प्रश्नों को सफलतापूर्वक चलाने के लिए, लेकिन डालने # 3 बयान नहीं किया ? आप एक ऐसे आदेश के साथ समाप्त हो जाएंगे जिसमें एक आइटम गुम हो रहा था, और वह कचरा डेटा होगा। यदि उस स्थिति में, आप सभी प्रश्नों को रोलबैक करना चाहते हैं, तो डेटाबेस उसी स्थिति में है जो से पहले ऑर्डर जोड़ रहा था और फिर शुरू हो गया था, ठीक है कि वास्तव में लेनदेन क्या हैं। ** आप एक साथ प्रश्न पूछते हैं कि आप या तो उन सभी को चाहते हैं, या अपवाद के मामले में, तो लेनदेन में कोई भी नहीं।

तो पी/FK की कमी की तरह, लेन-देन में मदद डेटा अखंडता बीमा **

+0

myIsam में innoDB का विरोध करने के लिए 1 जोड़ना, जब हम सिर्फ mySQL और innoDB को नहीं जानते हैं, तो हम नहीं जानते कि कई हैं इंजन। – pdem

2

InnoDB:।

MySQL में InnoDB स्तोरागे engine। InnoDB MySQL के लिए एक उच्च विश्वसनीयता और उच्च-प्रदर्शन स्टोरेज इंजन है।InnoDB का मुख्य लाभ में शामिल हैं:

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

InnoDB सीमाएं:

  • कोई पूर्ण पाठ अनुक्रमण (नीचे-5.6 mysql संस्करण)

  • के लिए तेजी से, केवल पढ़ने के

    संकुचित नहीं किया जा सकता है

अधिक जानकारी:

यह link

संबंधित मुद्दे