মাইআইএসএএম বনাম ইনোডিবি [বন্ধ]


857

আমি এমন একটি প্রকল্পে কাজ করছি যা অনেকগুলি ডাটাবেস জড়িত জড়িত, আমি বলব ( 70% সন্নিবেশ এবং 30% পড়ে ) reads এই অনুপাতের সাথে আপডেটগুলিও অন্তর্ভুক্ত থাকবে যা আমি একটি পঠিত এবং একটি লেখাকে বিবেচনা করি। পাঠাগুলি নোংরা হতে পারে (যেমন পড়ার সময় আমার 100% সঠিক তথ্য দরকার নেই)।
প্রশ্নে কাজটি এক ঘন্টার মধ্যে 1 মিলিয়নেরও বেশি ডাটাবেস লেনদেন করবে।

মাইআইএসএএম এবং ইনোডিবি-র মধ্যে পার্থক্য সম্পর্কে ওয়েবে আমি প্রচুর স্টাফ পড়েছি এবং মাইআইএসএএম আমার কাছে নির্দিষ্ট ডাটাবেস / টেবিলগুলির জন্য স্পষ্ট পছন্দ বলে মনে হচ্ছে যা আমি এই কাজের জন্য ব্যবহার করব। আমি যা পড়ছি বলে মনে হচ্ছে, সারি স্তর লকিং সমর্থিত হওয়ায় লেনদেনের প্রয়োজন হলে InnoDB ভাল loc

এই ধরণের লোড (বা আরও বেশি) নিয়ে কারও কি কোনও অভিজ্ঞতা আছে? মাইআইএসএএম কি যাওয়ার উপায়?


13
মাইএসকিউএল পারফরমেন্স ব্লগ জিনিস এই ধরনের একটি মহান সম্পদ।
সেজেজোজ

3
এটি আপনার সিস্টেম ওলটিপি বা আরও বেশি ডেটাওয়্যারহাউস ভিত্তিক কিনা (যেখানে বেশিরভাগ লেখকই বাল্ক লোড হচ্ছে) তার উপরে কিছুটা নির্ভর করবে।
টি

35
MyISAM সারি-লকিং, লেনদেনের সমর্থন করে না, এটা এমনকি, বিদেশী কী সমর্থন করে না ... জাহান্নাম যেহেতু এটি প্রদান করতে পারেন না ACID , এটা কমই এমনকি একটি সঠিক ডাটাবেসের বিবেচনা করা যেতে পারে! এই কারণেই মাইএসকিউএল 5.5 এর পরে ইনোডিবি ডিফল্ট ইঞ্জিন ... তবে যে কোনও কারণেই মাইআইএসএএম পিএইচপিএমআইএডমিনের মধ্যে তৈরি টেবিলগুলির জন্য ডিফল্ট ইঞ্জিন হিসাবে অবিরত রয়েছে, তাই মাইআইএসএএম চালানোর পরে প্রচুর পরিমাণে অপেশাদার ডাটাবেস রয়েছে।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট


উত্তর:


523

আমি সংক্ষেপে আছে আলোচনা একটি টেবিল এই প্রশ্ন তাই আপনি এই উপসংহারে আসতে পারি কিনা সঙ্গে যেতে InnoDB বা MyISAM

কোন ডিবি স্টোরেজ ইঞ্জিনটি আপনাকে কোন পরিস্থিতিতে ব্যবহার করা উচিত তার একটি ছোট সংক্ষিপ্ত বিবরণ এখানে দেওয়া হল:

                                                 মাইআইএসএএম ইনোডিবি
-------------------------------------------------- --------------
প্রয়োজনীয় পূর্ণ-পাঠ্য অনুসন্ধান হ্যাঁ 5.6.4
-------------------------------------------------- --------------
হ্যাঁ লেনদেনের প্রয়োজন
-------------------------------------------------- --------------
ঘন ঘন নির্বাচন জিজ্ঞাসা হ্যাঁ      
-------------------------------------------------- --------------
ঘন ঘন sertোকান, আপডেট করুন, হ্যাঁ মুছে দিন
-------------------------------------------------- --------------
সারি লকিং (একক টেবিলে একাধিক প্রক্রিয়াজাতকরণ) হ্যাঁ
-------------------------------------------------- --------------
সম্পর্কিত বেস নকশা হ্যাঁ

সারসংক্ষেপ

  • প্রায় সমস্ত পরিস্থিতিতে, InnoDB যাওয়ার সেরা উপায়
  • তবে, প্রায়শই পড়া, প্রায় কোনও লেখা নয়, মাইআইএসএএম ব্যবহার করুন
  • মাইএসকিউএলে সম্পূর্ণ পাঠ্য অনুসন্ধান <= 5.5, মাইআইএসএএম ব্যবহার করুন

11
মাইএসকিউএল 5.6 এ InnoDB- র সম্পূর্ণ পাঠ্য সূচী রয়েছে, তবে এখনও পর্যন্ত তারা উত্পাদন ব্যবহারের জন্য সত্যই প্রস্তুত নয়।
বিল কারভিন

3
অ্যাকর্ড 12.9। পূর্ণ-পাঠ্য অনুসন্ধানের ক্রিয়া , "সম্পূর্ণ-পাঠ্য সূচীগুলি কেবল ইনোডিবি বা মাইআইএসএএম টেবিলের সাহায্যে ব্যবহার করা যেতে পারে"। মাইএসকিউএল> = 5.6 এর জন্য ঠিক আছে বলে মনে হচ্ছে, তবে মাইএসকিউএল 5.5 এর একই পৃষ্ঠায় এখনও বলা হয়েছে "সম্পূর্ণ-পাঠ্য সূচীগুলি কেবল মাইআইএসএএম টেবিলের সাহায্যে ব্যবহার করা যেতে পারে"। উপরের সারণীটি মাইএসকিউএল সংস্করণগুলির সাথে কীভাবে আলাদা হয় তা জানাতে আপডেট করা যেতে পারে। দুর্ভাগ্যক্রমে, এখনও অবধি মাইএসকিউএল 5.5 মানক বলে মনে হচ্ছে।
Hibou57

2
এর অর্থ কী: InnoDB - full-text: 5.6.4?? এটি এইচএস হ্যাঁ বা না?

2
মাইআইএসএএম অভ্যন্তরীণভাবেও সারি গণনা সঞ্চয় করে। অতএব, মাইআইএসএএম এ গণনা () ফাংশনটি প্রায় বিনামূল্যে, যেখানে ইনোডিবিতে একটি লক্ষণীয় সময় লাগে।
Hedeshy

3
ভাল টেবিল, তবে মান এবং স্থিতিশীলতার জন্য একটি সারি যুক্ত করা, মাইআইসাম = না, নির্দোষ ডিবি = হ্যাঁ এটি আরও উন্নত করে
তুলবে

268

আমি কোনও ডাটাবেস বিশেষজ্ঞ নই, এবং আমি অভিজ্ঞতা থেকে কথা বলি না। যাহোক:

মাইআইএসএএম টেবিলগুলি টেবিল-স্তর লকিং ব্যবহার করে । আপনার ট্র্যাফিক অনুমানের উপর ভিত্তি করে, আপনার প্রতি সেকেন্ডে 200 এর কাছাকাছি লেখা রয়েছে। মাইআইএসএএম এর সাথে, এর মধ্যে কেবল একটির যে কোনও সময়ে অগ্রগতি হতে পারে । আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার হার্ডওয়্যার এই লেনদেনটি অতিক্রম করতে না পারে, অর্থাত্, একটি একক ক্যোয়ারী 5 এমএসের বেশি নিতে পারে না।

এটি আমার কাছে পরামর্শ দেয় আপনার একটি স্টোরেজ ইঞ্জিনের প্রয়োজন হবে যা সারি-স্তরের লকিং, অর্থাৎ ইনোডিবি সমর্থন করে।

অন্যদিকে, প্রতিটি স্টোরেজ ইঞ্জিনের সাহায্যে লোড অনুকরণ করার জন্য কয়েকটি সাধারণ স্ক্রিপ্ট লিখতে মোটামুটি তুচ্ছ হওয়া উচিত should


12
200 এর কাছাকাছি? তার গড় লেনদেন 2.5 প্রশ্নের, যে এর [(2.5 * 1M) / 3600s =] 700 কাছাকাছি তোলে
Ozzy

12
আমি এর সাথেও একমত নই a single query can take no more than 5msকারণ আপনি ২ টি সম্ভাবনা অনুমান করেছেন; উত্তর: সমস্ত প্রশ্নের একই টেবিল ও বিয়ের প্রয়োজন: কেবলমাত্র 1 টি সংযোগ ছিল! আমার আপনাকে জানানো উচিত যে উচ্চতর র‌্যাম সহ একটি লিনাক্স এবং মাইএসকিউএল 5.5 সেটআপ 10,000 টি একসাথে সংযোগগুলিকে সমর্থন করতে পারে (দেখুন: dev.mysql.com/doc/refman//5.5/en/too-many-connifications.html )
ওজি

152
যখন কোনও টেবিলটি টেবিল লক করা থাকে, কেবল একবারে কেবলমাত্র একটি ক্যোয়ারী তার বিরুদ্ধে চলতে পারে। সার্ভার 10000 একযোগে সংযোগগুলি সমর্থন করে কিনা তা বিবেচ্য নয়, টেবিলটি লক থাকা অবস্থায় প্রত্যেকে ব্যাকআপ নেবে।
রায়ানার

2
এছাড়াও এটি জেনে রাখা সহায়ক হতে পারে যে মাইআইএসএএম স্থানিক সূচককে সমর্থন করে যখন ইনোডিবি না করে। এবং মাইআইএসএএম বিদেশী কীগুলি ব্যবহার করে না বলে মনে হয় না যদিও এটি কোনও তৈরি করা রোধ করে না।
ক্রাইভার

4
@ ক্রাইভার: মাইআইএসএএম টেবিলগুলিতে আপনার কাছে বিদেশী কী থাকতে পারে না। আপনি তৈরি টেবিল বিবৃতিতে এফকে সংজ্ঞা অন্তর্ভুক্ত করতে পারেন তবে সেগুলি (সংজ্ঞাগুলি) কেবল উপেক্ষা করা হবে।
ypercubeᵀᴹ

191

লোকেরা প্রায়শই পারফরম্যান্সের বিষয়ে কথা বলেন, বনাম লেখেন, বিদেশী কী ইত্যাদি পড়েন my তবে আমার মতে স্টোরেজ ইঞ্জিনের জন্য আরও একটির অবশ্যই থাকতে হবে: পারমাণবিক আপডেট।

এটা চেষ্টা কর:

  1. আপনার মাইআইএসএএম টেবিলের বিপরীতে একটি আপডেট আপডেট করুন যা 5 সেকেন্ড সময় নেয়।
  2. আপডেটের অগ্রগতি চলাকালীন, 2.5 সেকেন্ডের মধ্যে বলুন, এতে বাধা দিতে Ctrl-C চাপুন।
  3. টেবিলে প্রভাবগুলি পর্যবেক্ষণ করুন। কত সারি আপডেট করা হয়েছে? কতগুলি আপডেট করা হয়নি? টেবিলটি কি পাঠযোগ্য, বা আপনি যখন সিটিআরএল-সি-তে আঘাত করেছিলেন তখন কি তা দূষিত হয়েছিল?
  4. কোনও পরীক্ষার অগ্রগতিতে বাধা দিয়ে কোনও ইনোডিবি টেবিলের বিপরীতে আপডেটের সাথে একই পরীক্ষা করে দেখুন।
  5. InnoDB টেবিলটি পর্যবেক্ষণ করুন। জিরো সারি আপডেট করা হয়েছিল। ইনোডিবি আপনাকে আশ্বাস দিয়েছে যে পারমাণবিক আপডেট রয়েছে এবং যদি সম্পূর্ণ আপডেট প্রতিশ্রুতিবদ্ধ না করা যায় তবে এটি পুরো পরিবর্তনটি ফিরিয়ে আনবে। এছাড়াও, টেবিলটি দূষিত নয়। এমনকি যদি আপনি killall -9 mysqldকোনও ক্র্যাশ অনুকরণ করতে ব্যবহার করেন তবে এটি কাজ করে ।

পারফরম্যান্স অবশ্যই কাম্য, তবে তথ্য হারাতে না পারা উচিত।


4
রেকর্ডের জন্য, এসিডি ডাটাবেসের অন্যান্য বৈশিষ্ট্যগুলি - ধারাবাহিকতা, বিচ্ছিন্নতা এবং স্থায়িত্ব - মাইআইএসএএম দ্বারা সমর্থিত নয়।
বিল কারভিন

কন্ট্রোল-সিটি টেবিলটিকে দূষিত করবে না - যেমন পরীক্ষার টেবিলে সাফল্য ফিরে আসবে এবং সমস্ত প্রশ্ন ত্রুটি ছাড়াই এগিয়ে চলবে। মাইআইএসএএম সমস্ত রেকর্ড আপডেট না করে আপডেটটি বাতিল করে দেবে, তবে টেবিলটি অভ্যন্তরীণ কাঠামোগত অখণ্ডতা বজায় রাখবে। সিএসটিএমএম দিয়ে মাইএসকিএলডকে মেরে ফেলার একই প্রভাব থাকবে। তবে আপনি যদি এটিকে সিগিল (কিল -9) বা কিছু ক্র্যাশিং সিগন্যাল দেন (বা এটি কোনও বাগ আঘাতের পরে এটি নিজেই উপার্জন করে), বা ওএস ক্র্যাশ / পাওয়ার হারিয়ে গেছে, তবে এটি আলাদা গল্প - আপনি দেখতে পারেন মাইআইএসএএম-পর্যায়ের দুর্নীতি।
সাশা পাচেভ

1
InnoDB রোয়ালি হিসাবে নিজেকে দূষিত করতে পারে, সাধারণত মাইস্যামের তুলনায় বেশি রয়্যাল হয় it এসিডি-র বিড়ম্বনাটি হ'ল আমাদের সকল কিছুরই ধারণা নেই। সুতরাং যখন InnoDB সব দিতে পারে না, এটি কিছুই দেয় না - অভ্যন্তরীণ দৃsert়তা, এবং এটি কিছুটা চালাতে অস্বীকার করে কারণ কোনও কাঠামোর একটি বাইট ভুল wrong 90% সময়টিকে উপেক্ষা করা যেতে পারে এবং এটি সর্বাধিক মাত্র একটি টেবিলকে প্রভাবিত করে। সাম্প্রতিক পারকোনা সার্ভারগুলির সাথে এটির মোকাবিলা করার বিকল্প রয়েছে - ইনোডাব_পাস_কর্পুট_ টেবিল।
সাশা পাচেভ

1
আমি গত 3 দিন থেকে এই জাতীয় তথ্য অনুসন্ধান করছিলাম, এখন আমি এটি পেয়েছি। ইনোডিবি সেরা। ধন্যবাদBill Karwin
ব্যবহারকারীর 3833682

3
@ ফ্লো টু, আজকাল খুব কাছাকাছি কেউ নেই। আমার শেষ কাজটিতে আমরা মাইআইএসএএমকে একটি সার্ভারে একটি টেবিলের জন্য ব্যবহার করেছি এবং এর একমাত্র কারণ ছিল মাইআইএসএএম ইনোডিবি-র চেয়ে কম নির্দিষ্ট জায়গায় সেই নির্দিষ্ট টেবিলটি সংরক্ষণ করতে সক্ষম হয়েছিল। আমরা ডিস্ক স্পেসে সীমাবদ্ধ ছিলাম তাই ডাটাবেস অন্য সার্ভারে না নিয়ে যাওয়া পর্যন্ত আমাদের মাইএসএএম ব্যবহার করতে হয়েছিল। আমার নতুন চাকরিতে, ইতিমধ্যে একটি নীতি রয়েছে যে প্রতিটি টেবিলটি অবশ্যই InnoDB হওয়া উচিত।
বিল কারভিন

138

আমি মাইএসকিউএল ব্যবহার করে একটি উচ্চ-ভলিউম সিস্টেমে কাজ করেছি এবং আমি মাইআইএসএএম এবং ইনোডিবি উভয়ই চেষ্টা করেছি।

আমি দেখতে পেলাম যে মাইআইএসএএম-এ টেবিল-স্তরের লকিংয়ের ফলে আমাদের কাজের চাপের জন্য গুরুতর পারফরম্যান্স সমস্যা দেখা দিয়েছে যা আপনার মত মনে হচ্ছে। দুর্ভাগ্যক্রমে আমি আরও জানতে পেরেছিলাম যে InnoDB এর অধীনে পারফরম্যান্স আমি আশা করার চেয়েও খারাপ ছিল।

শেষ পর্যন্ত আমি বিতর্কিত সমস্যাটি সমাধান করে ডেটাগুলি টুকরো টুকরো করে সন্নিবেশগুলি একটি "গরম" টেবিলের মধ্যে চলে যায় এবং কখনও কখনও উত্তপ্ত টেবিলটি অনুসন্ধান করে না তা নির্বাচন করে।

এটি মুছে ফেলার অনুমতি দেয় (ডেটা সময় সংবেদনশীল ছিল এবং আমরা কেবলমাত্র X দিন ধরে রেখেছিলাম) "বাসি" টেবিলগুলিতে ঘটতে পারে যা আবার নির্বাচিত প্রশ্নের দ্বারা স্পর্শ করা হয়নি। আইএনএনডিবিতে বাল্ক মুছে ফেলার বিষয়ে খারাপ অভিনয় রয়েছে বলে মনে হচ্ছে সুতরাং আপনি যদি ডেটা পরিষ্কার করার পরিকল্পনা করছেন তবে আপনি এটি এমনভাবে গঠন করতে চাইতে পারেন যে পুরানো ডেটাটি একটি বাসি টেবিলের মধ্যে থাকে যা এতে মুছে ফেলার পরিবর্তে কেবল বাদ দেওয়া যায়।

অবশ্যই আপনার আবেদন কী তা আমার কোনও ধারণা নেই তবে আশা করি এটি আপনাকে মাইআইএসএএম এবং ইনোডিবি-র কিছু সমস্যা সম্পর্কে অন্তর্দৃষ্টি দেয়।


3
'শেষ পর্যন্ত আমি বিতর্কিত সমস্যাটি সমাধান করে ডেটাগুলি টুকরো টুকরো করে সন্নিবেশগুলি একটি "হট" টেবিলের মধ্যে চলে যাই এবং কখনই হট টেবিলটি জিজ্ঞাসা করি না তা নির্বাচন করে না a " - বাফার পুলটি মূলত এটি কি নয় ?
ব্লুরাজা - ড্যানি প্লুঘুফুট

15
ড্যানি - না, আসলেই না। সার্ভার সেটিংস টিউন করা গুরুত্বপূর্ণ, তবে কোনওভাবেই আপনার স্কিমার চিন্তাশীল কাঠামোর বিকল্প নেই। আপনার যদি খুব বেশি ডিবি থাকে তবে উপলভ্য র‌্যামের থেকে অনেক বড় এবং অ্যাক্সেস প্যাটার্নগুলি যা সমস্ত ডিবি জুড়ে এলোমেলোভাবে ডেটা স্পর্শ করে তবে বিশ্বের সমস্ত বাফার পুল টিউন আপনাকে সাহায্য করবে না। আপনি যদি ডেটা এবং অ্যাক্সেসের ধরণগুলি বুঝতে পারেন তবে যত্ন সহকারে ডিজাইনের মাধ্যমে আপনি অনেকটা ব্যথা প্রশমিত করতে পারেন।
alanc10n

66

গেমটি থেকে কিছুটা দেরি ... তবে আমি বেশ কয়েক মাস আগে মাইআইএসএএম এবং ইনোডিবি-র মধ্যে প্রধান পার্থক্য বিশদটি লিখেছিলাম একটি বিস্তৃত পোস্ট এখানে । একটি চুপা (এবং সম্ভবত একটি বিস্কুট) ধরুন, এবং উপভোগ করুন।


মাইআইএসএএম এবং ইনোডিবি-র মধ্যে প্রধান পার্থক্য হ'ল রেফারেন্সিয়াল অখণ্ডতা এবং লেনদেন। লকিং, রোলব্যাকস এবং পূর্ণ-পাঠ্য অনুসন্ধানের মতো অন্যান্য পার্থক্য রয়েছে।

উল্লেখ সততা

রেফারেন্সিয়াল অখণ্ডতা সুনির্দিষ্ট করে যে টেবিলের মধ্যে সম্পর্ক সুসংগত থাকে। আরও সুনির্দিষ্টভাবে, এর অর্থ যখন কোনও টেবিলের (উদাহরণস্বরূপ তালিকাগুলি) কোনও বিদেশী কী থাকে (যেমন পণ্য আইডি) কোনও আলাদা টেবিলের প্রতি নির্দেশ করে (উদাহরণস্বরূপ পণ্য), যখন আপডেটগুলি বা মুছে ফেলা টুয়েন্টি টেবিলের সাথে ঘটে তখন এই পরিবর্তনগুলি লিঙ্কটিতে সংযুক্ত করা হয় টেবিল। আমাদের উদাহরণস্বরূপ, যদি কোনও পণ্যের নাম পরিবর্তন করা হয়, লিঙ্কিং টেবিলের বিদেশী কীগুলিও আপডেট হবে; যদি কোনও পণ্য 'পণ্য' টেবিল থেকে মুছে ফেলা হয়, মুছে ফেলা প্রবেশের দিকে নির্দেশ করে এমন কোনও তালিকাও মুছে ফেলা হবে। তদ্ব্যতীত, যে কোনও নতুন তালিকার অবশ্যই বৈধ, বিদ্যমান প্রবেশের দিকে নির্দেশ করে সেই বিদেশী কী থাকতে হবে।

ইনোডিবি হ'ল রিলেশনাল ডিবিএমএস (আরডিবিএমএস) এবং এর ফলে রেফারেন্সিয়াল অখণ্ডতা রয়েছে, যদিও মাইআইএসএএম তা করে না।

লেনদেন এবং পারমাণবিকতা

কোনও সারণির ডেটা ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ (ডিএমএল) বিবৃতি যেমন নির্বাচন, INSERT, আপডেট এবং ডিলিট ব্যবহার করে পরিচালনা করা হয়। কোনও লেনদেন গোষ্ঠী দুই বা ততোধিক ডিএমএল একসাথে কাজের একক ইউনিটে বিবৃতি দেয়, সুতরাং হয় পুরো ইউনিটটি প্রয়োগ করা হয়, বা এর কোনওটিই হয় না।

মায়আইএসএএম লেনদেন সমর্থন করে না যেখানে ইনোডিবি করে।

যদি মাইআইএসএএম টেবিলটি ব্যবহার করার সময় কোনও ক্রিয়াকলাপ ব্যাহত হয়, তত্ক্ষণাত্ অপারেশনটি বাতিল হয়ে যায়, এবং সারিগুলি (বা প্রতিটি সারির মধ্যে থাকা ডেটা) ক্ষতিগ্রস্থ হয়, এমনকি অপারেশন সম্পন্ন না হয়ে গেলেও ক্ষতিগ্রস্ত থাকে।

ইনোডিবি টেবিল ব্যবহার করার সময় যদি কোনও ক্রিয়াকলাপ ব্যাহত হয়, কারণ এটি লেনদেনগুলি ব্যবহার করে, যার মধ্যে পারমাণবিকতা রয়েছে, কোনও লেনদেন যা সম্পন্ন হয় নি কার্যকর হবে না, যেহেতু কোন প্রতিশ্রুতিবদ্ধতা করা হয়নি।

সারণী-লকিং বনাম সারি-লকিং

যখন কোনও কোয়েস্ট কোনও মাইআইএসএএম টেবিলের বিপরীতে চলে, তখন যে সারণীতে এটি জিজ্ঞাসা করা হচ্ছে তা পুরো লক হয়ে যাবে। এর অর্থ হল পরবর্তী প্রশ্নগুলি কেবলমাত্র বর্তমানের সমাপ্তির পরে কার্যকর করা হবে। যদি আপনি একটি বড় টেবিলটি পড়ছেন, এবং / অথবা ঘন ঘন পড়া এবং লেখার ক্রিয়াকলাপ হয় তবে এর অর্থ প্রশ্নের একটি বিশাল ব্যাকলগ হতে পারে।

যখন কোনও কোয়েরি কোনও ইনোডিবি টেবিলের বিপরীতে চলে, তখন জড়িত কেবল সারি (গুলি) লক হয়ে থাকে, বাকী টেবিলটি CRUD ক্রিয়াকলাপের জন্য উপলব্ধ থাকে। এর অর্থ হল কোয়েরিগুলি একই টেবিলে একই সাথে চলতে পারে তবে তারা একই সারিটি ব্যবহার না করে।

InnoDB- এ এই বৈশিষ্ট্যটি সমঝোতা হিসাবে পরিচিত। সমষ্টি হিসাবে যতটা দুর্দান্ত, তেমনি একটি বড় ত্রুটি রয়েছে যা নির্বাচিত টেবিলগুলির একটি নির্দিষ্ট ব্যাপ্তির জন্য প্রযোজ্য, এতে কার্নেলের থ্রেডগুলির মধ্যে স্যুইচ করার ক্ষেত্রে একটি ওভারহেড রয়েছে এবং সার্ভারটি থামতে না পারার জন্য আপনার কার্নেল থ্রেডগুলির একটি সীমা নির্ধারণ করা উচিত ।

লেনদেন এবং রোলব্যাকস

আপনি যখন মাইআইএসএএম-তে কোনও অপারেশন চালান, পরিবর্তনগুলি সেট করা হয়; InnoDB এ, সেই পরিবর্তনগুলি আবার ঘুরিয়ে দেওয়া যেতে পারে। লেনদেন নিয়ন্ত্রণ করতে সর্বাধিক সাধারণ আদেশগুলি হ'ল কমিট, রোলব্যাক এবং সেভপয়েন্ট O ১. কমিট - আপনি একাধিক ডিএমএল অপারেশন লিখতে পারবেন, তবে পরিবর্তনগুলি কেবল তখনই সাশ্রয় হবে যখন কোন কমিট তৈরি হবে ২. রোলব্যাক - আপনি যে কোনও অপারেশন এখনও প্রতিশ্রুতিবদ্ধ হয়নি তা বাতিল করতে পারেন 3.. সংরক্ষণ করুন - তালিকার একটি পয়েন্ট সেট করে একটি রোলব্যাক অপারেশন যেখানে রোলব্যাক করতে পারে operations

বিশ্বাসযোগ্যতা

মাইআইএসএএম কোনও ডেটা অখণ্ডতা সরবরাহ করে না - হার্ডওয়্যার ব্যর্থতা, অশুচি শাটডাউন এবং বাতিল অপারেশনগুলির ফলে ডেটাটি দুর্নীতিগ্রস্থ হতে পারে। এর জন্য সূচিপত্র এবং সারণীগুলির পুরো মেরামত বা পুনর্নির্মাণের প্রয়োজন হবে।

অন্যদিকে, ইনোডিবি দুর্নীতি রোধে একটি লেনদেনের লগ, একটি ডাবল লিখনের বাফার এবং স্বয়ংক্রিয় চেকসামিং এবং বৈধতা ব্যবহার করে। ইনোডিবি কোনও পরিবর্তন করার আগে, এটি আইবডাতা 1 নামে একটি সিস্টেম টেবিলস্পেস ফাইলটিতে লেনদেনের আগে ডেটা রেকর্ড করে। যদি কোনও ক্র্যাশ হয় তবে InnoDB those লগগুলির পুনরায় খেলতে হবে ore

ফুলটেক্স ইনডেক্সিং

InnoDB মাইএসকিউএল সংস্করণ 5.6.4 অবধি ফুলটেক্সট ইনডেক্সিং সমর্থন করে না। এই পোস্টটি লেখা হিসাবে, অনেক শেয়ার্ড হোস্টিং সরবরাহকারীদের মাইএসকিউএল সংস্করণটি এখনও 5.6.4 এর নীচে, যার অর্থ ফুলটেক্সট ইনডেক্সিং InnoDB টেবিলগুলির জন্য সমর্থিত নয়।

তবে এটি মাইআইএসএএম ব্যবহারের কোনও বৈধ কারণ নয়। কোনও হোস্টিং সরবরাহকারীতে পরিবর্তন করা ভাল যা মাইএসকিউএল-এর সর্বশেষতম সংস্করণগুলিকে সমর্থন করে। এমন নয় যে মাইআইএসএএম টেবিল যা ফুলটেক্সট ইনডেক্সিং ব্যবহার করে কোনও ইনোডিবি টেবিলে রূপান্তর করা যায় না।

উপসংহার

উপসংহারে, InnoDB আপনার পছন্দসই ডিফল্ট স্টোরেজ ইঞ্জিন হওয়া উচিত। মাইআইএসএএম বা অন্যান্য ডেটা প্রকারগুলি যখন কোনও নির্দিষ্ট প্রয়োজন পরিবেশন করে তা চয়ন করুন।


আমি একটি পিএইচপি অধিবেশন চেকসাম স্ক্রিপ্ট তৈরি করছিলাম এবং আমার বেশিরভাগ কী [এজেড 9] এর এলোমেলো স্ট্রিং ছিল ... ইনোডব 30 মিমি ধরে একটি কাজ করেছিল INSERT ON DUPLICATE KEY UPDATEতাই আমি মাইসাম চেষ্টা করেছি এবং এখন এটি <1 মিমি অবধি নেমে এসেছে ... অনেক উত্তর আমি দেখেছি বলেছি যে 'আনসোর্টেবল' (এলোমেলো স্ট্রিং) অনন্য কীগুলি মোকাবেলা করার জন্য ইনোডাবের একটি কঠিন সময় আছে ... তাতে আমাদের কী কোনও ইনপুট আছে? আসলে আমি ভাবছিলাম যে এটি মাইআইএসএএম ব্যবহার করতে হবে তবে আপনার দুর্দান্ত উত্তর আমাকে বুঝতে পেরেছিল যে এটি সেই বিশেষ ক্ষেত্রে যাওয়ার উপায় ছিল।
লুই লাউডোগ ট্রটিটিয়ার

64

আরও লেখার এবং পড়ার বোঝার জন্য, আপনি ইনোডিবি থেকে উপকৃত হবেন। যেহেতু InnoDB সারণী-লকিংয়ের পরিবর্তে সারি-লকিং সরবরাহ করে, আপনার SELECTগুলি কেবল একে অপরের সাথে নয়, অনেকগুলি INSERTএস-এর সাথেও একই সাথে হতে পারে । তবে, আপনি যদি এসকিউএল লেনদেনগুলি ব্যবহার না করার পরিকল্পনা না করেন তবে ইনোডিবি কমিট ফ্ল্যাশকে 2 এ সেট করুন ( ইনোডাব_ফ্লুশ_লগ_এটি_আরএক্সএক্সমিট )। এটি আপনাকে প্রচুর কাঁচা পারফরম্যান্স ফিরিয়ে দেয় যা মাইআইএসএএম থেকে ইনোডিবিতে সারণী সরিয়ে নেওয়ার সময় আপনি হারাবেন।

এছাড়াও, প্রতিলিপি যোগ বিবেচনা করুন। এটি আপনাকে কিছু পড়ার স্কেলিং দেয় এবং যেহেতু আপনি বলেছিলেন যে আপনার পাঠাগুলি আপ-টু-ডেট হতে হবে না, আপনি অনুলিপিটিকে কিছুটা পিছনে যেতে দিতে পারেন। কেবলমাত্র নিশ্চিত হন যে এটি সবচেয়ে ভারী ট্র্যাফিক ব্যতীত অন্য কোনও কিছুতে ধরা পড়তে পারে বা এটি সর্বদা পিছনে থাকবে এবং কখনই এটি ধরা পড়বে না। তবে আপনি যদি এই পথে যান তবে আমি আপনাকে দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে আপনি দাসদের কাছ থেকে পড়া এবং আপনার ডাটাবেস হ্যান্ডলারের প্রতিলিপি পিছনে পড়া থেকে বিরত থাকুন। অ্যাপ্লিকেশন কোডটি এই সম্পর্কে না জানলে এটি এত সহজ।

অবশেষে, বিভিন্ন টেবিলের বোঝা সম্পর্কে সচেতন হন। সমস্ত টেবিলে আপনার একই পাঠ / লেখার অনুপাত থাকবে না। প্রায় 100% রিড সহ কয়েকটি ছোট টেবিলগুলি মাইআইএসএএম থাকতে পারে। তেমনি, আপনার কাছে যদি কিছু টেবিল থাকে যা 100% INSERT DELAYEDরাইটিংয়ের কাছাকাছি থাকে তবে আপনি এতে উপকৃত হতে পারেন , তবে এটি কেবল মাইআইএসএএম-এ সমর্থিত (একটি আইএনওডিবি DELAYEDটেবিলের জন্য ধারাটি উপেক্ষা করা হবে)।

তবে বেঞ্চমার্ক নিশ্চিত হতে হবে।


4
আপনি যে "InnoDB প্রতিশ্রুতিবদ্ধ ফ্লাশ" বলতে চান innodb_flush_log_at_trx_commit?
সেজেজোজ

2
আমি আপনার পোস্টটি খুব দরকারী খুঁজে পেয়েছি - ধন্যবাদ। আমার টেবিলগুলির জন্য কখন মাইআইএসএএম / ইনোডিবি ব্যবহার করবেন তা মূল্যায়ন করছে এবং আপনার পোস্টটি সহায়ক ছিল। চিয়ার্স।
স্টারমনকি

2
dev.mysql.com/doc/refman/5.5/en/insert-delayed.html বলেছেন: মাইআইএসএএম টেবিলগুলির জন্য, যদি ডেটা ফাইলের মাঝখানে কোনও মুক্ত ব্লক না থাকে, সমবর্তী SELECT এবং INSERT বিবৃতিগুলি সমর্থনযোগ্য are এই পরিস্থিতিতে আপনার খুব কমই মাইসামের সাথে সংক্ষেপে বিলম্ব করা প্রয়োজন।
tymtam

খুব তথ্যপূর্ণ পোস্ট। আমি অপের মত একই প্রশ্ন ছিল এবং আমি বলতে হবে যে আপনার পোস্ট আমার ডাটাবেস ইঞ্জিন সিদ্ধান্ত সম্পর্কে স্বাচ্ছন্দ্য বোধ করেছেন। ধন্যবাদ! ++
জো মাজেভস্কি

দ্রুত দ্রষ্টব্য: দেরি এখন আর 5.7 এ সমর্থিত নয়। পরিবর্তে আপনি LOW_PRIORITY দিয়ে পরীক্ষা করতে চাইতে পারেন।
ওয়েবম্যাট

59

দুটি ইঞ্জিনের মধ্যে যান্ত্রিক পার্থক্য কভার করে এখানে প্রতিক্রিয়াগুলির বিস্তৃত নির্বাচনের সাথে যুক্ত করতে আমি একটি অভিজ্ঞতাগত গতির তুলনা সমীক্ষা উপস্থাপন করি।

খাঁটি গতির ক্ষেত্রে, মাইআইএসএএম সর্বদা ইনোডিবি-র চেয়ে দ্রুত হয় না তবে আমার অভিজ্ঞতায় এটি প্রায় ২.০-২.৫ বারের ফ্যাক্টর দ্বারা খাঁটি রিড কাজের পরিবেশের জন্য দ্রুততর হয় faster স্পষ্টতই এটি সমস্ত পরিবেশের জন্য উপযুক্ত নয় - অন্যেরা যেমন লিখেছেন, মাইআইএসএএম-তে লেনদেন এবং বিদেশী কীগুলির মতো জিনিস নেই।

আমি নীচে কিছুটা বেঞ্চমার্কিং করেছি - আমি লুপিংয়ের জন্য অজগর এবং সময় তুলনার জন্য সময়কালীন গ্রন্থাগার ব্যবহার করেছি। আগ্রহের জন্য আমি মেমরি ইঞ্জিনটিও অন্তর্ভুক্ত করেছি, এটি বোর্ড জুড়ে সেরা পারফরম্যান্স দেয় যদিও এটি কেবলমাত্র ছোট টেবিলের জন্য উপযুক্ত (আপনি The table 'tbl' is fullযখন মাইএসকিউএল মেমরির সীমা অতিক্রম করেন তখন আপনি ক্রমাগত মুখোমুখি হন )। আমি যে চার ধরণের নির্বাচনকে দেখেছি তা হ'ল:

  1. ভ্যানিলা নির্বাচন
  2. গন্য
  3. শর্তসাপেক্ষ নির্বাচন
  4. ইনডেক্সড এবং অ-সূচকযুক্ত উপ-নির্বাচন

প্রথমত, আমি নিম্নলিখিত এসকিউএল ব্যবহার করে তিনটি টেবিল তৈরি করেছি

CREATE TABLE
    data_interrogation.test_table_myisam
    (
        index_col BIGINT NOT NULL AUTO_INCREMENT,
        value1 DOUBLE,
        value2 DOUBLE,
        value3 DOUBLE,
        value4 DOUBLE,
        PRIMARY KEY (index_col)
    )
    ENGINE=MyISAM DEFAULT CHARSET=utf8

'মাইআইএসএএম' এর সাহায্যে দ্বিতীয় এবং তৃতীয় টেবিলে 'ইনোডিবি' এবং 'মেমরির' বিকল্প রয়েছে।

 

1) ভ্যানিলা নির্বাচন

প্রশ্ন: SELECT * FROM tbl WHERE index_col = xx

ফলাফল: আঁকুন

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা ভ্যানিলা নির্বাচনের তুলনা

এর গতি সমস্ত বিস্তৃতভাবে একই এবং প্রত্যাশা অনুযায়ী নির্বাচিত কলামগুলির সংখ্যার মধ্যে লিনিয়ার। InnoDB মাইআইএসএএম এর চেয়ে কিছুটা দ্রুত বলে মনে হচ্ছে তবে এটি সত্যিই প্রান্তিক।

কোড:

import timeit
import MySQLdb
import MySQLdb.cursors
import random
from random import randint

db = MySQLdb.connect(host="...", user="...", passwd="...", db="...", cursorclass=MySQLdb.cursors.DictCursor)
cur = db.cursor()

lengthOfTable = 100000

# Fill up the tables with random data
for x in xrange(lengthOfTable):
    rand1 = random.random()
    rand2 = random.random()
    rand3 = random.random()
    rand4 = random.random()

    insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
    insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
    insertString3 = "INSERT INTO test_table_memory (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

    cur.execute(insertString)
    cur.execute(insertString2)
    cur.execute(insertString3)

db.commit()

# Define a function to pull a certain number of records from these tables
def selectRandomRecords(testTable,numberOfRecords):

    for x in xrange(numberOfRecords):
        rand1 = randint(0,lengthOfTable)

        selectString = "SELECT * FROM " + testTable + " WHERE index_col = " + str(rand1)
        cur.execute(selectString)

setupString = "from __main__ import selectRandomRecords"

# Test time taken using timeit
myisam_times = []
innodb_times = []
memory_times = []

for theLength in [3,10,30,100,300,1000,3000,10000]:

    innodb_times.append( timeit.timeit('selectRandomRecords("test_table_innodb",' + str(theLength) + ')', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('selectRandomRecords("test_table_myisam",' + str(theLength) + ')', number=100, setup=setupString) )
    memory_times.append( timeit.timeit('selectRandomRecords("test_table_memory",' + str(theLength) + ')', number=100, setup=setupString) )

 

2) গণনা

প্রশ্ন: SELECT count(*) FROM tbl

ফলাফল: মাইআইএসএএম জিতেছে

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা গণনা তুলনা

এটি মাইআইএসএএম এবং ইনোডিবি - মাইআইএসএএম (এবং মেমোরি) এর মধ্যে একটি বড় পার্থক্য দেখায় যে এই সারণীতে রেকর্ডের সংখ্যার উপর নজর রাখে, তাই এই লেনদেনটি দ্রুত এবং ও (1)। InnoDB গণনা করতে যে পরিমাণ সময় প্রয়োজন তা তদন্তের পরিসীমাতে সারণির আকারের সাথে অতিরিক্ত-লিনিয়ারলি বাড়ায়। আমার সন্দেহ হয় যে মাইআইএসএএম ক্যোয়ারীগুলি থেকে অনেকগুলি গতি-আপগুলি যা অনুশীলনে দেখা হয় এটি একই রকম প্রভাবের কারণে।

কোড:

myisam_times = []
innodb_times = []
memory_times = []

# Define a function to count the records
def countRecords(testTable):

    selectString = "SELECT count(*) FROM " + testTable
    cur.execute(selectString)

setupString = "from __main__ import countRecords"

# Truncate the tables and re-fill with a set amount of data
for theLength in [3,10,30,100,300,1000,3000,10000,30000,100000]:

    truncateString = "TRUNCATE test_table_innodb"
    truncateString2 = "TRUNCATE test_table_myisam"
    truncateString3 = "TRUNCATE test_table_memory"

    cur.execute(truncateString)
    cur.execute(truncateString2)
    cur.execute(truncateString3)

    for x in xrange(theLength):
        rand1 = random.random()
        rand2 = random.random()
        rand3 = random.random()
        rand4 = random.random()

        insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString3 = "INSERT INTO test_table_memory (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

        cur.execute(insertString)
        cur.execute(insertString2)
        cur.execute(insertString3)

    db.commit()

    # Count and time the query
    innodb_times.append( timeit.timeit('countRecords("test_table_innodb")', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('countRecords("test_table_myisam")', number=100, setup=setupString) )
    memory_times.append( timeit.timeit('countRecords("test_table_memory")', number=100, setup=setupString) )

 

3) শর্তসাপেক্ষ নির্বাচন

প্রশ্ন: SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5

ফলাফল: মাইআইএসএএম জিতেছে

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা শর্তাধীন নির্বাচনের তুলনা

এখানে, মাইআইএসএএম এবং মেমরি প্রায় একই কাজ করে এবং বড় টেবিলের জন্য ইনোডিবিকে প্রায় 50% দ্বারা পরাজিত করে। এটি এমন কোয়েরি যা এর জন্য মাইআইএসএএমের সুবিধাগুলি সর্বাধিক করা হয়েছে।

কোড:

myisam_times = []
innodb_times = []
memory_times = []

# Define a function to perform conditional selects
def conditionalSelect(testTable):
    selectString = "SELECT * FROM " + testTable + " WHERE value1 < 0.5 AND value2 < 0.5 AND value3 < 0.5 AND value4 < 0.5"
    cur.execute(selectString)

setupString = "from __main__ import conditionalSelect"

# Truncate the tables and re-fill with a set amount of data
for theLength in [3,10,30,100,300,1000,3000,10000,30000,100000]:

    truncateString = "TRUNCATE test_table_innodb"
    truncateString2 = "TRUNCATE test_table_myisam"
    truncateString3 = "TRUNCATE test_table_memory"

    cur.execute(truncateString)
    cur.execute(truncateString2)
    cur.execute(truncateString3)

    for x in xrange(theLength):
        rand1 = random.random()
        rand2 = random.random()
        rand3 = random.random()
        rand4 = random.random()

        insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
        insertString3 = "INSERT INTO test_table_memory (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

        cur.execute(insertString)
        cur.execute(insertString2)
        cur.execute(insertString3)

    db.commit()

    # Count and time the query
    innodb_times.append( timeit.timeit('conditionalSelect("test_table_innodb")', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('conditionalSelect("test_table_myisam")', number=100, setup=setupString) )
    memory_times.append( timeit.timeit('conditionalSelect("test_table_memory")', number=100, setup=setupString) )

 

4) উপ-নির্বাচন

ফলাফল: ইনোডিবি জিতেছে

এই ক্যোয়ারির জন্য, আমি সাব-সিলেক্টের জন্য টেবিলগুলির একটি অতিরিক্ত সেট তৈরি করেছি। প্রতিটি হ'ল বিজিআইএনটিসের কেবল দুটি কলাম, একটি প্রাথমিক কী সূচক সহ একটি এবং কোনও সূচি ছাড়াই। বড় টেবিল আকারের কারণে, আমি মেমরি ইঞ্জিনটি পরীক্ষা করিনি। এসকিউএল টেবিল তৈরি কমান্ড ছিল

CREATE TABLE
    subselect_myisam
    (
        index_col bigint NOT NULL,
        non_index_col bigint,
        PRIMARY KEY (index_col)
    )
    ENGINE=MyISAM DEFAULT CHARSET=utf8;

যেখানে আবার 'মাইআইএসএএম' দ্বিতীয় টেবিলে 'ইনোডিবি'র পরিবর্তিত হবে।

এই ক্যোয়ারিতে আমি নির্বাচন টেবিলের আকার 1000000 এ রেখেছি এবং পরিবর্তে উপ-নির্বাচিত কলামগুলির আকারের পরিবর্তিত।

বিভিন্ন ডাটাবেস ইঞ্জিন দ্বারা উপ-নির্বাচনের তুলনা

এখানে InnoDB সহজেই জয়ী হয়। আমরা কোনও যুক্তিসঙ্গত আকারের টেবিলটিতে পৌঁছানোর পরে উপ-নির্বাচনের আকারের সাথে উভয় ইঞ্জিনই স্ক্যান করে রৈখিকভাবে। সূচকটি মাইআইএসএএম কমান্ডকে গতি দেয় তবে আকর্ষণীয়ভাবে ইনোডিবি গতিতে খুব কম প্রভাব ফেলে। subSelect.png

কোড:

myisam_times = []
innodb_times = []
myisam_times_2 = []
innodb_times_2 = []

def subSelectRecordsIndexed(testTable,testSubSelect):
    selectString = "SELECT * FROM " + testTable + " WHERE index_col in ( SELECT index_col FROM " + testSubSelect + " )"
    cur.execute(selectString)

setupString = "from __main__ import subSelectRecordsIndexed"

def subSelectRecordsNotIndexed(testTable,testSubSelect):
    selectString = "SELECT * FROM " + testTable + " WHERE index_col in ( SELECT non_index_col FROM " + testSubSelect + " )"
    cur.execute(selectString)

setupString2 = "from __main__ import subSelectRecordsNotIndexed"

# Truncate the old tables, and re-fill with 1000000 records
truncateString = "TRUNCATE test_table_innodb"
truncateString2 = "TRUNCATE test_table_myisam"

cur.execute(truncateString)
cur.execute(truncateString2)

lengthOfTable = 1000000

# Fill up the tables with random data
for x in xrange(lengthOfTable):
    rand1 = random.random()
    rand2 = random.random()
    rand3 = random.random()
    rand4 = random.random()

    insertString = "INSERT INTO test_table_innodb (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"
    insertString2 = "INSERT INTO test_table_myisam (value1,value2,value3,value4) VALUES (" + str(rand1) + "," + str(rand2) + "," + str(rand3) + "," + str(rand4) + ")"

    cur.execute(insertString)
    cur.execute(insertString2)

for theLength in [3,10,30,100,300,1000,3000,10000,30000,100000]:

    truncateString = "TRUNCATE subselect_innodb"
    truncateString2 = "TRUNCATE subselect_myisam"

    cur.execute(truncateString)
    cur.execute(truncateString2)

    # For each length, empty the table and re-fill it with random data
    rand_sample = sorted(random.sample(xrange(lengthOfTable), theLength))
    rand_sample_2 = random.sample(xrange(lengthOfTable), theLength)

    for (the_value_1,the_value_2) in zip(rand_sample,rand_sample_2):
        insertString = "INSERT INTO subselect_innodb (index_col,non_index_col) VALUES (" + str(the_value_1) + "," + str(the_value_2) + ")"
        insertString2 = "INSERT INTO subselect_myisam (index_col,non_index_col) VALUES (" + str(the_value_1) + "," + str(the_value_2) + ")"

        cur.execute(insertString)
        cur.execute(insertString2)

    db.commit()

    # Finally, time the queries
    innodb_times.append( timeit.timeit('subSelectRecordsIndexed("test_table_innodb","subselect_innodb")', number=100, setup=setupString) )
    myisam_times.append( timeit.timeit('subSelectRecordsIndexed("test_table_myisam","subselect_myisam")', number=100, setup=setupString) )

    innodb_times_2.append( timeit.timeit('subSelectRecordsNotIndexed("test_table_innodb","subselect_innodb")', number=100, setup=setupString2) )
    myisam_times_2.append( timeit.timeit('subSelectRecordsNotIndexed("test_table_myisam","subselect_myisam")', number=100, setup=setupString2) )

আমি মনে করি এই সমস্তের গ্রহনের বার্তাটি হ'ল আপনি যদি গতি সম্পর্কে সত্যই উদ্বিগ্ন হন তবে কোন ইঞ্জিনটি আরও উপযুক্ত হবে সে সম্পর্কে কোনও অনুমানের চেয়ে আপনি যে প্রশ্নগুলি করছেন তা বেঞ্চমার্ক করা দরকার।


1
কর্মক্ষমতা সবসময় একমাত্র বিবেচনা হয় না, স্থায়িত্ব সম্পর্কে গ্রাফ সম্পর্কে কীভাবে? কোনও ইঞ্জিন কোনও কিছুর জন্য ভাল নয় যদি এটি ক্র্যাশ হয় এবং বেসিক ডাটাবেস বৈশিষ্ট্যগুলি সমর্থন করে না।
পিলভডিজিস

1
ফাইলটি InnoDB- এর my.cnfজন্য অনুকূলিত না করা হলে মাইআইএসএএম সম্ভবত বেশিরভাগ সময় ইনোইডিবিকে পরাজিত করবে । আপনার my.cnfফাইলটি কেমন দেখাচ্ছে তা আপনি উল্লেখ করেন নি যা সত্যই InnoDB পারফরম্যান্সের জন্য সবচেয়ে গুরুত্বপূর্ণ উপাদান।
itoctopus

ধন্যবাদ আইটোকটপস - আপনার প্রস্তাবিত যে কোনও অপটিমাইজেশন সম্পর্কে আমি আরও শুনতে আগ্রহী। এই পরীক্ষাগুলিতে ব্যবহৃত পুরো কোডটি উপরে রয়েছে, বিভিন্ন অপটিমাইজেশন সহ পরীক্ষাগুলির পুনরাবৃত্তি করতে দ্বিধা বোধ করুন এবং যদি আপনি ফলাফলগুলিতে উল্লেখযোগ্য পরিবর্তন পান তবে আমাদের জানান
StackG

32

সামান্য পরিমাণে অফ-টপিক, তবে ডকুমেন্টেশনের উদ্দেশ্যে এবং সম্পূর্ণতার জন্য, আমি নিম্নলিখিতটি যুক্ত করতে চাই।

সাধারণভাবে InnoDB ব্যবহারের ফলে অনেক কম জটিল অ্যাপ্লিকেশন পাওয়া যাবে, সম্ভবত এটি আরও ত্রুটিমুক্ত। যেহেতু আপনি সমস্ত রেফারেন্সিয়াল অখণ্ডতা (বৈদেশিক কী-সীমাবদ্ধতা) ডেটামোডেলে রাখতে পারেন, তাই মাইআইএসএএম-এর সাথে আপনার যতটা প্রয়োজন অ্যাপ্লিকেশন কোডের প্রয়োজন নেই near

প্রতিবার আপনি যখন কোনও রেকর্ড সন্নিবেশ করবেন, মুছবেন বা প্রতিস্থাপন করবেন, তখন আপনাকে সম্পর্কগুলি যাচাই করতে এবং বজায় রাখতে হবে। যেমন আপনি যদি কোনও পিতামাতাকে মুছেন তবে সমস্ত শিশুদেরও মুছে ফেলা উচিত। উদাহরণস্বরূপ, এমনকি একটি সাধারণ ব্লগিং সিস্টেমে, আপনি যদি কোনও ব্লগপোস্টিং রেকর্ড মুছে ফেলেন তবে আপনাকে মন্তব্য রেকর্ডগুলি, পছন্দগুলি ইত্যাদি মুছতে হবে ইনোডিবিতে এটি ডাটাবেস ইঞ্জিন দ্বারা স্বয়ংক্রিয়ভাবে সম্পন্ন হবে (যদি আপনি মডেলটিতে সীমাবদ্ধতা নির্দিষ্ট করে থাকেন তবে ) এবং কোনও অ্যাপ্লিকেশন কোড প্রয়োজন। মাইআইএসএমে এটিকে অ্যাপ্লিকেশনটিতে কোড করতে হবে, যা ওয়েব সার্ভারগুলিতে খুব কঠিন। ওয়েব-সার্ভারগুলি প্রকৃতিগতভাবে খুব সামঞ্জস্যপূর্ণ / সমান্তরাল এবং কারণ এই ক্রিয়াগুলি পরমাণু হওয়া উচিত এবং মাইআইএসএএম কোনও সত্যিকারের লেনদেন সমর্থন করে না, মাইআইএসএএম-কে ওয়েব-সার্ভারগুলির জন্য ব্যবহার করা ঝুঁকিপূর্ণ / ত্রুটি-প্রবণ।

এছাড়াও বেশিরভাগ সাধারণ ক্ষেত্রে, ইনোডিবি আরও অনেক বেশি কার্য সম্পাদন করবে, একাধিক কারণে, তাদের মধ্যে একটি টেবিল-স্তর লক করার বিপরীতে রেকর্ড স্তর লকিং ব্যবহার করতে সক্ষম হচ্ছে। লেখাগুলি কেবল পাঠের চেয়ে ঘন ঘন এমন পরিস্থিতিতে নয়, বড় ডেটাসেটগুলিতে জটিল যোগদানের পরিস্থিতিতেও। আমরা মাইআইএসএএম টেবিলগুলিতে খুব বড় বড় যোগ দিতে (বেশ কয়েক মিনিট সময় নিরীক্ষণের জন্য) ইনোডিবি টেবিল ব্যবহার করে আমরা 3 গুণ কর্মক্ষমতা বৃদ্ধি লক্ষ্য করেছি।

আমি বলব যে মাইএসকিউএল ব্যবহার করার সময় সাধারণভাবে ইনোডিবি (রেফারেনশিয়াল অখণ্ডতার সাথে একটি 3NF ডেটামোডেল ব্যবহার করে) ডিফল্ট পছন্দ হওয়া উচিত। মাইআইএসএএম শুধুমাত্র খুব নির্দিষ্ট ক্ষেত্রে ব্যবহার করা উচিত। এটি সম্ভবত কম সঞ্চালন করবে, এর ফলে আরও বড় এবং আরও বগি অ্যাপ্লিকেশন হবে।

এই কথা বলে. ডেটামোডেলিং এমন একটি শিল্প যা কদাচিৎ ওয়েব ডিজাইনার / -প্রোগ্রামারদের মধ্যে পাওয়া যায়। কোনও অপরাধ নয়, তবে এটি মাইআইএসএএম এত বেশি ব্যবহৃত হচ্ছে তা ব্যাখ্যা করে।


31

ইনোডিবি অফারগুলি:

ACID transactions
row-level locking
foreign key constraints
automatic crash recovery
table compression (read/write)
spatial data types (no spatial indexes)

ইনোডিবিতে টেক্সট এবং বিএলওবি ব্যতীত সারিতে থাকা সমস্ত ডেটা সর্বাধিক 8,000 বাইট দখল করতে পারে। InnoDB- এর জন্য কোনও সম্পূর্ণ পাঠ্য ইনডেক্সিং উপলভ্য নয়। ইনোডিবিতে COUNT (*) গুলি (যখন সেখানে, গ্রুপ দ্বারা বা যোগদান করা হয় না) মাইআইএসএএম এর চেয়ে ধীরে চালিত করুন কারণ সারি গণনা অভ্যন্তরীণভাবে সংরক্ষণ করা হয়নি। InnoDB একটি ফাইলে ডেটা এবং সূচি উভয়ই সঞ্চয় করে। InnoDB ডেটা এবং সূচক উভয়কে ক্যাশে করতে একটি বাফার পুল ব্যবহার করে।

মাইআইএসএএম অফার দেয়:

fast COUNT(*)s (when WHERE, GROUP BY, or JOIN is not used)
full text indexing
smaller disk footprint
very high table compression (read only)
spatial data types and indexes (R-tree)

মাইআইএসএএম-এ টেবিল-স্তর লকিং রয়েছে তবে সারি-স্তরের লকিং নেই। কোনও লেনদেন নেই। কোনও স্বয়ংক্রিয় ক্র্যাশ পুনরুদ্ধার নয়, তবে এটি মেরামতের টেবিল কার্যকারিতা সরবরাহ করে। কোনও বিদেশী কী বাধা নেই। InnoDB টেবিলের তুলনায় মাইআইএসএএম টেবিলগুলি সাধারণত ডিস্কে আকারে আরও কমপ্যাক্ট থাকে। মাইআইএসএএম টেবিলগুলি প্রয়োজনে মাইসম্প্যাকের সাথে সংকোচনের মাধ্যমে আকারে আরও উচ্চ হ্রাস করা যেতে পারে তবে কেবল পঠনযোগ্য হয়ে উঠবে। মাইআইএসএএম একটি ফাইলে সূচি এবং অন্যটিতে ডেটা সঞ্চয় করে। মাইআইএসএএম ক্যাচিং সূচিগুলির জন্য কী বাফার ব্যবহার করে এবং ডেটা ক্যাচিং পরিচালনাকে অপারেটিং সিস্টেমে ফেলে দেয়।

সামগ্রিকভাবে আমি বিশেষত ব্যবহারের জন্য বেশিরভাগ উদ্দেশ্যে ইনোইডিবি এবং মাইআইএসএএম-কে সুপারিশ করব। ইনোডিবি এখন নতুন মাইএসকিউএল সংস্করণগুলিতে ডিফল্ট ইঞ্জিন।


2
FWWW, InnoDB- এ VARCHAR BLOB এবং TEXT এর মতো ওভারফ্লো পৃষ্ঠাতেও যেতে পারে। এই সমস্ত ডেটা ধরণের একইভাবে অভ্যন্তরীণভাবে সংরক্ষণ করা হয়।
বিল কারভিন

জেনে রাখা ভাল, @ বিলকারভিন! আমরা আমাদের অ্যাপ্লিকেশনগুলিতে ভারচারের ভারী ব্যবহার করি এবং এই 8 কেবি সীমাতে ভ্রচারার অবদান রাখার বিষয়টি ছিল কিছুটা।
রিনোগো

আরও বিশদ জানতে mysqlperformanceblog.com/2010/02/09/blob-stores-in-innodb দেখুন ।
বিল কারভিন

মাইএসকিউএল সংস্করণ ৫..6 + -তে ইনোডাব ইঞ্জিন হিসাবে উত্তর আজকাল নেই তবে আজকাল সম্পূর্ণ টেক্সট ইনডেক্সিং এবং মাইএসকিউএল 5.5 + / 5.7 + স্থানিক ডেটা ধরণের (5.5+) এবং স্থানিক সূচকগুলি (আর-টি) (5.7+) সমর্থন করে .. সর্বোত্তম সমর্থনের জন্য আপনার কমপক্ষে মাইএসকিউএল সংস্করণ 5.7+ থাকা দরকার
রেমন্ড নিজল্যান্ড

25

যদি আপনি মাইআইএসএএম ব্যবহার করেন তবে আপনি প্রতি ডিএমএল স্টেটমেন্টকে লেনদেন হিসাবে বিবেচনা না করে (যা কোনও ক্ষেত্রে ক্র্যাশ হওয়ার ক্ষেত্রে টেকসই বা পারমাণবিক হবে না) আপনি প্রতি ঘন্টা কোনও লেনদেন করবেন না।

অতএব আমি আপনাকে InnoDB ব্যবহার করতে হবে বলে মনে করি।

প্রতি সেকেন্ডে 300 লেনদেনের মতো বেশ কিছু লাগে। আপনার যদি এই লেনদেনগুলি পুরোপুরি পাওয়ার ব্যর্থতার জুড়ে টেকসই হওয়ার প্রয়োজন হয় তবে নিশ্চিত হয়ে নিন যে আপনার I / O সাবসিস্টেমটি প্রতি সেকেন্ডে সহজেই এই বহু লেখাকে পরিচালনা করতে পারে। আপনার ব্যাটারি ব্যাকযুক্ত ক্যাশে সহ কমপক্ষে একটি RAID নিয়ামক প্রয়োজন।

আপনি যদি একটি ছোট স্থায়িত্ব হিট নিতে পারেন তবে আপনি ইনডোডিবি ব্যবহার করতে পারেন ইনোএনডিবি_ফ্লুশ_লগ_্যাট_আরএক্সএক্সকমিট 0 বা 2 তে সেট করে (বিশদটির জন্য ডকস দেখুন), আপনি কর্মক্ষমতা উন্নত করতে পারেন।

এমন অনেকগুলি প্যাচ রয়েছে যা গুগল এবং অন্যদের থেকে একযোগে বাড়াতে পারে - এগুলি যদি আপনি এখনও তাদের ব্যতীত পর্যাপ্ত পারফরম্যান্স না পান তবে আগ্রহী হতে পারে।


24

প্রশ্ন এবং উত্তরগুলির বেশিরভাগের মেয়াদ শেষ

হ্যাঁ, এটি পুরানো স্ত্রীর কাহিনী যে মাইআইএসএএম ইনোডিবি-র চেয়ে দ্রুত। প্রশ্নের তারিখটি লক্ষ্য করুন: ২০০৮; এটি এখন প্রায় এক দশক পরে। ইনোডিবি তার পর থেকে উল্লেখযোগ্য পারফরম্যান্সের গতি বাড়িয়েছে।

: নাটকীয় গ্রাফ এক ক্ষেত্রে যেখানে MyISAM ধিক্কার জানাই ছিল COUNT(*) ছাড়া একটি WHEREদফা। আপনি কি আপনার সময় ব্যয় করেন তা কি সত্যই?

আপনি যদি একযোগে পরীক্ষা চালায় তবে InnoDB এর পক্ষে খুব সম্ভবত জিততে পারেMEMORY

SELECTsমাইআইএসএএম বেঞ্চমার্ক করার সময় আপনি যদি কোনও লেখাগুলি করেন এবং MEMORYটেবিল-স্তর লক হওয়ার কারণে হেরে যাওয়ার সম্ভাবনা থাকে।

আসলে, ওরাকল এতটাই নিশ্চিত যে ইনোডিবি আরও ভাল যে তারা মাইআইএসএএম 8.0 থেকে অপসারণ করেছে।

প্রশ্ন গোড়ার দিকে 5.1 দিনে লেখা হয়েছিল। সেই থেকে এই প্রধান সংস্করণগুলিকে "সাধারণ উপলভ্যতা" হিসাবে চিহ্নিত করা হয়েছিল:

  • 2010: 5.5 (ডিসেম্বর .8)
  • 2013: 5.6 (.10 ফেব্রুয়ারিতে।)
  • 2015: 5.7 (অক্টোবর .9)
  • 2018: 8.0 (এপ্রিল .11)

নীচের লাইন: মাইআইএসএএম ব্যবহার করবেন না


2
মাইএসকিউএল ডাটাবেস প্রযুক্তি অগ্রগতি। এবং স্ট্যাকওভারফ্লো প্রশ্ন এবং উত্তরগুলি অতীতে প্রচ্ছন্ন থাকে। প্রধান MyISAM এবং InnoDB মধ্যে পার্থক্য আছে কম সম্পর্কে সার্ভারে "লোড", এবং আরো জন্য সমর্থন সম্পর্কে উল্লেখ সততা এবং লেনদেন , সেইসাথে সম্পাতবিন্দু এবং recoverability (+10)
spencer7593

12

মাইএসকিউএল নিজেই কিছু ড্রপ-ইন প্রতিস্থাপন পরীক্ষা করে দেখুন:

MariaDB

http://mariadb.org/

মারিয়াডিবি একটি ডাটাবেস সার্ভার যা মাইএসকিউএল-এর জন্য ড্রপ-ইন প্রতিস্থাপন কার্যকারিতা সরবরাহ করে offers ফ্রি এবং ওপেন সোর্স সফ্টওয়্যার বিকাশকারীদের বিস্তৃত সম্প্রদায়ের সহায়তায় মাইএসকিউএলের মূল লেখকদের কয়েক দ্বারা মারিয়াডিবি নির্মিত হয়েছে। মাইএসকিউএলের মূল কার্যকারিতা ছাড়াও, মারিয়াডিবি বিকল্প স্টোরেজ ইঞ্জিন, সার্ভার অপ্টিমাইজেশন এবং প্যাচ সহ বৈশিষ্ট্য বর্ধনের সমৃদ্ধ সেট সরবরাহ করে।

পারকোনা সার্ভার

https://launchpad.net/percona-server

আরও ভাল পারফরম্যান্স, উন্নত ডায়াগনস্টিকস এবং যুক্ত বৈশিষ্ট্য সহ মাইএসকিউএল-এর উন্নত ড্রপ-ইন প্রতিস্থাপন।


1
আমি তাদের উভয়ই ব্যবহার করছি (প্রযোজনায় পারকোনা, উইন্ডোজ-বিকাশে মারিয়া)। তারা দ্রুত আর এ এবং perefectly কাজ করে।
মোশে এল

4
এটি প্রশ্নের উত্তর দেয় না। মারিয়াডিবি এবং পারকোনা মাইএসকিউএল এর কাঁটাচামচ, এবং ইনোডিবি এবং মাইআইএসএএম ইঞ্জিনগুলিও ব্যবহার করে।
dr_

12

দয়া করে নোট করুন যে আমার আনুষ্ঠানিক শিক্ষা এবং অভিজ্ঞতা ওরাকল এর সাথে রয়েছে, যখন মাইএসকিউএল এর সাথে আমার কাজ সম্পূর্ণ ব্যক্তিগত এবং আমার নিজের সময়ে হয়েছে, তাই আমি যদি এমন কথা বলি যা ওরাকলের পক্ষে সত্য তবে মাইএসকিউএলের ক্ষেত্রে সত্য নয় তবে আমি ক্ষমা চাইছি। দুটি সিস্টেম প্রচুর ভাগ করে নিলেও, রিলেশনাল থিওরি / বীজগণিত একই, এবং রিলেশনাল ডাটাবেসগুলি এখনও রিলেশনাল ডাটাবেস, এখনও প্রচুর পার্থক্য রয়েছে !!

আমি বিশেষত (পাশাপাশি সারি-স্তরের লকিং) পছন্দ করি যে ইনোডিবি লেনদেন ভিত্তিক, যার অর্থ আপনি আপনার ওয়েব অ্যাপ্লিকেশনটির একটি "অপারেশন" এর জন্য বেশ কয়েকবার আপডেট / সন্নিবেশ / তৈরি / পরিবর্তন / বাদ দেওয়া / ইত্যাদি করতে পারেন। যে সমস্যাটি দেখা দেয় তা কেবল যদি হয় সেই পরিবর্তনগুলি / ক্রিয়াকলাপগুলির মধ্যে কয়েকটি প্রতিশ্রুতিবদ্ধ হয়ে শেষ হয় তবে অন্যরা তা না করে তবে আপনি বেশিরভাগ সময় (ডাটাবেজের নির্দিষ্ট নকশার উপর নির্ভরশীল) বিরোধী ডেটা / কাঠামো সহ একটি ডাটাবেস শেষ করবেন।

বিঃদ্রঃ: ওরাকল দিয়ে, তৈরি / পরিবর্তন / ড্রপ স্টেটমেন্টগুলিকে "ডিডিএল" (ডেটা সংজ্ঞা) বিবৃতি বলা হয়, এবং স্পষ্টতই একটি প্রতিশ্রুতি ট্রিগার করে। "ডিএমএল" (ডেটা ম্যানিপুলেশন) নামক বিবৃতি সন্নিবেশ / আপডেট / মুছুন, স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ হয় না তবে কেবল যখন কোনও ডিডিএল, প্রতিশ্রুতিবদ্ধ হয় বা প্রস্থান / প্রস্থান হয় (অথবা আপনি যদি নিজের সেশনটি "অটো-কমিট" তে সেট করেন, বা যদি আপনার ক্লায়েন্ট অটো কমিট করে)। ওরাকলের সাথে কাজ করার সময় এটি সম্পর্কে সচেতন হওয়া জরুরি, তবে মাইএসকিউএল কীভাবে দুই ধরনের বিবৃতি পরিচালনা করে তা আমি নিশ্চিত নই। এর কারণে, আমি এটা পরিষ্কার করে দিতে চাই যে এটি মাইএসকিউএল এ আসে যখন আমি এটি সম্পর্কে নিশ্চিত নই; কেবল ওরাকল দিয়ে।

যখন লেনদেন ভিত্তিক ইঞ্জিনগুলি এক্সেল করে তার একটি উদাহরণ:

ধরা যাক যে আমি বা আপনি একটি ওয়েব-পৃষ্ঠায় একটি নিখরচায় ইভেন্টে অংশ নিতে সাইন আপ করতে এসেছি এবং সিস্টেমটির মূল উদ্দেশ্যগুলির মধ্যে একটি হ'ল কেবলমাত্র 100 জনকে সাইন আপ করতে দেওয়া, কারণ এটি বসার সীমা অনুষ্ঠানের জন্য একবার 100 টি সাইন-আপ পৌঁছে গেলে, সিস্টেমটি আরও সাইনআপগুলি অক্ষম করে, কমপক্ষে অন্যদের বাতিল হওয়া পর্যন্ত।

এই ক্ষেত্রে, অতিথিদের জন্য একটি টেবিল (নাম, ফোন, ইমেল, ইত্যাদি) থাকতে পারে এবং একটি সারণী সাইন আপ করা অতিথির সংখ্যা ট্র্যাক করে tra আমাদের এইভাবে একটি "লেনদেন" এর জন্য দুটি অপারেশন রয়েছে। এখন ধরা যাক গেস্ট তথ্য টেবিলে অতিথির তথ্য যুক্ত হওয়ার পরে কোনও সংযোগ ক্ষতি, বা একই প্রভাবের সাথে একটি ত্রুটি রয়েছে। জিইউএসটিএস টেবিলটি আপডেট করা হয়েছিল (sertedোকানো হয়েছিল), তবে "উপলভ্য আসনগুলি" আপডেট করার আগে সংযোগটি হারিয়েছিল।

এখন আমাদের কাছে অতিথি টেস্টে যোগ হয়েছে, তবে উপলব্ধ আসনের সংখ্যা এখন ভুল (উদাহরণস্বরূপ, মানটি 85 হয় যখন এটি 84 হয়)।

অবশ্যই এটি পরিচালনা করার অনেকগুলি উপায় রয়েছে যেমন "অতিথির টেবিলে সারিগুলির 100 বিয়োগ সংখ্যার সাথে উপলব্ধ সিট ট্র্যাক করা" বা এমন কিছু কোড যা তথ্যটি ধারাবাহিকভাবে পরীক্ষা করে ইত্যাদি ইত্যাদি .... তবে লেনদেন ভিত্তিক ডাটাবেস সহ ইঞ্জিন যেমন InnoDB যেমন, হয় সব অপারেশনের প্রতিশ্রুতিবদ্ধ হয়, অথবা কিছুই না তাদের আছে। এটি অনেক ক্ষেত্রে সহায়ক হতে পারে তবে আমি যেমন বলেছি এটি নিরাপদ থাকার একমাত্র উপায় নয়, না (তবে একটি দুর্দান্ত উপায়, তবে প্রোগ্রামার / স্ক্রিপ্ট-লেখক নয়, ডাটাবেস দ্বারা পরিচালিত)।

এগুলি সমস্ত "লেনদেন ভিত্তিক" এর মূল অর্থ এই প্রসঙ্গে, যদি না আমি কিছু মিস করি - তবে পুরো লেনদেনটি যেমনটি করা উচিত সফল হয়, বা কিছুই হয় না পরিবর্তন হয় না, যেহেতু কেবলমাত্র আংশিক পরিবর্তন করা নাবালককে আবদ্ধ করতে পারে না ডাটাবেস, সম্ভবত এটি দূষিত ...

তবে আমি এটি আরও একবার বলব, গোলযোগ করা এড়ানো একমাত্র উপায় নয়। তবে ইঞ্জিন নিজেই পরিচালনা করে এমন একটি পদ্ধতি যা আপনাকে কোড / স্ক্রিপ্টে ফেলে কেবলমাত্র "লেনদেন সফল হয়েছিল কি না এবং" নিজেই পরিবর্তে (যেমন পুনরায় চেষ্টা করা) না হলে আমি কী করব? ডাটাবেসের বাইরে থেকে "ম্যানুয়ালি" এটি পরীক্ষা করতে কোড লেখার, এবং এই জাতীয় ইভেন্টগুলির জন্য আরও অনেক কাজ করা।

শেষ অবধি, সারণী-লকিং বনাম সারি-লকিং সম্পর্কে একটি নোট:

অস্বীকৃতি: মাইএসকিউএল সম্পর্কিত সমস্ত ক্ষেত্রে আমি ভুল হতে পারি এবং অনুমান / উদাহরণ পরিস্থিতিগুলি দেখার বিষয়, তবে আমি ঠিক কী ভুল হতে পারি মাইএসকিউএল দিয়ে কারণ দুর্নীতি করা সম্ভব। উদাহরণগুলি সাধারণ প্রোগ্রামিংয়ে খুব বাস্তব, এমনকি মাইএসকিউএল এ জাতীয় জিনিসগুলি এড়াতে আরও বেশি ব্যবস্থা থাকলেও ...

যাইহোক, আমি যারা যুক্তি দিয়েছি যে একবারে কয়টি সংযোগ অনুমোদিত তা লক করা টেবিলের চারপাশে কাজ করে না তাদের সাথে একমত হওয়ার ব্যাপারে আমি যথেষ্ট আত্মবিশ্বাসী । আসলে, একাধিক সংযোগগুলি একটি টেবিল লক করার সম্পূর্ণ পয়েন্ট !! যাতে অন্যান্য প্রক্রিয়া / ব্যবহারকারী / অ্যাপ্লিকেশন একই সময়ে পরিবর্তন করে ডেটাবেসকে দূষিত করতে না পারে।

একই সারিতে কাজ করা দু'জন বা আরও সংযোগগুলি কীভাবে আপনার জন্য সত্যই খারাপ দিন তৈরি করবে ?? ধরুন, একই সারিতে একই মান আপডেট করার জন্য দুটি প্রক্রিয়া রয়েছে / প্রয়োজন আছে, আসুন বলি যে সারিটি একটি বাস ট্যুরের রেকর্ড, এবং দুটি প্রক্রিয়া প্রতিটি একই সাথে "রাইডার" বা "উপলব্ধ_সীটগুলি" আপডেট করতে চায় ক্ষেত্রটি "বর্তমান মান আরও 1।" হিসাবে

আসুন এটি অনুমানের সাথে ধাপে ধাপে:

  1. প্রক্রিয়া একটির বর্তমান মানটি পড়ে, আসুন এটি খালি বলা যাক, এখন পর্যন্ত '0' রয়েছে।
  2. প্রক্রিয়া দুইটি বর্তমান মানটিও পড়ে, যা এখনও 0।
  3. প্রক্রিয়া এক লিখেছে (বর্তমান + 1) যা 1।
  4. প্রক্রিয়া দুই উচিত 2 লেখা, কিন্তু যেহেতু এটি বর্তমান মান পড়া সামনে এক লেখ নতুন মান প্রক্রিয়া, এটা খুব টেবিলে 1 লিখেছেন।

আমি নিশ্চিত নই যে দুটি সংযোগ এইরকম মিলিত হতে পারে, প্রথম লেখার আগে উভয়ই পড়তে হয় ... তবে তা না হলে আমি তখনও সমস্যাটি দেখতে পাবো:

  1. প্রক্রিয়া একটি বর্তমান মানটি পড়ে, যা 0 হয়।
  2. প্রক্রিয়া এক লিখেছে (বর্তমান + 1), যা 1।
  3. প্রক্রিয়া দুটি এখনকার মানটি পড়ে। তবে একটি ডিআইডি রাইটিং (আপডেট) প্রক্রিয়াকরণের সময়, এটি ডেটা প্রতিশ্রুতি দেয় না, সুতরাং কেবল একই প্রক্রিয়াটি তার আপডেট হওয়া নতুন মানটি পড়তে পারে, অন্যদিকে সমস্ত প্রতিশ্রুতি না হওয়া অবধি পুরানো মানটি দেখে।

এছাড়াও, কমপক্ষে ওরাকল ডাটাবেসের সাথে, বিচ্ছিন্নতা স্তর রয়েছে, যা আমি প্যারাফ্রেজ করার চেষ্টা করে আমাদের সময় নষ্ট করব না। এখানে সেই বিষয়ে একটি ভাল নিবন্ধ রয়েছে, এবং প্রতিটি বিচ্ছিন্নতা স্তরের এটির পক্ষে ভাল এবং বুদ্ধি রয়েছে, যা লেনদেন ভিত্তিক ইঞ্জিনগুলির একটি ডেটাবেজে কীভাবে গুরুত্বপূর্ণ হতে পারে সেই সাথে চলে ...

শেষ অবধি, বিদেশী-কীগুলি এবং লেনদেন-ভিত্তিক মিথস্ক্রিয়া পরিবর্তে মাইআইএসএএম-র মধ্যে পৃথক পৃথক সুরক্ষার ব্যবস্থা থাকতে পারে। ভাল, এক জন্য, একটি সম্পূর্ণ টেবিল লক করা হয়েছে যে সত্য, এটি লেনদেন / FKs প্রয়োজন হয় যে কম সম্ভাব্য করে তোলে ।

আর হায়, আপনি যদি এই সম্মতিযুক্ত বিষয়গুলি সম্পর্কে সচেতন হন তবে হ্যাঁ আপনি এটিকে কম সুরক্ষিতভাবে খেলতে পারেন এবং কেবল আপনার অ্যাপ্লিকেশনগুলি লিখতে পারেন, আপনার সিস্টেমগুলি সেট আপ করুন যাতে এই জাতীয় ত্রুটিগুলি সম্ভব না হয় (আপনার কোডটি তখন ডাটাবেসের চেয়ে বরং দায়বদ্ধ)। তবে, আমার মতে, আমি বলব যে যথাসম্ভব সুরক্ষা ব্যবস্থা ব্যবহার করা, প্রতিরক্ষামূলকভাবে প্রোগ্রামিং করা এবং সর্বদা সচেতন হওয়া যে মানুষের ত্রুটি সম্পূর্ণরূপে এড়ানো সম্ভব নয় aware এটি প্রত্যেকের ক্ষেত্রেই ঘটে এবং যে কেউ বলে যে তারা এর থেকে সুরক্ষিত সে অবশ্যই মিথ্যা বলবে, বা "হ্যালো ওয়ার্ল্ড" অ্যাপ্লিকেশন / স্ক্রিপ্ট লেখার চেয়ে বেশি কিছু করেনি। ;-)

আমি আশা করি যে এর কিছুটি কারও কারও পক্ষে সহায়ক এবং আরও বেশি, আমি আশা করি যে আমি এখনই অনুমানের অপরাধী এবং ভুল হিসাবে মানুষ হয়ে উঠিনি! যদি তাই হয় তবে আমার ক্ষমাপ্রার্থনা, তবে উদাহরণগুলি সম্পর্কে চিন্তা করা ভাল, ঝুঁকি নিয়ে গবেষণা করা ইত্যাদি আরও ভাল, এমনকি যদি তারা এই নির্দিষ্ট প্রসঙ্গে সম্ভাব্য নাও হয়।

আমাকে সংশোধন করতে নির্দ্বিধায় এই "উত্তরটি" সম্পাদনা করুন, এমনকি এটিতে ভোট দিন। অন্যের সাথে আমার খারাপ ধারণা সংশোধন করার পরিবর্তে দয়া করে উন্নতি করার চেষ্টা করুন। ;-)

এটি আমার প্রথম প্রতিক্রিয়া, সুতরাং দয়া করে সমস্ত দাবি অস্বীকারকারী ইত্যাদির কারণে দৈর্ঘ্যটি ক্ষমা করুন ... আমি যখন একেবারে নিশ্চিত না হই তখন আমি কেবল অহঙ্কারী শুনতে চাই না!



5

আমার অভিজ্ঞতায়, মাইআইএসএএম যতক্ষণ না আপনি মুছে ফেলুন, আপডেট করবেন না, পুরো সিঙ্গল ইনসার্ট, লেনদেন এবং পূর্ণ-পাঠ্য সূচী না করাই একটি ভাল পছন্দ ছিল। বিটিডাব্লু, চেক টেবিল ভয়ঙ্কর। সারণির সংখ্যার বিচারে টেবিলটি বড় হওয়ার সাথে সাথে এটি কখন শেষ হবে তা আপনি জানেন না।


2
পূর্ণ-পাঠ্য ইনডেক্সিং কেবল মাইআইএসএএম দিয়েই সম্ভব, ইনোডিবি দিয়ে নয়।
পিক্সেল এলিফ্যান্ট

2
@ পিক্সেল এলিফ্যান্ট, এটি মাইএসকিউএল 5.6-এ পরিবর্তন শুরু করবে। ইনোডিবিতে একটি পূর্ণ পাঠ্য সূচী টাইপ রয়েছে, তবে এখনও পর্যন্ত এটি আইএমএইচওর উত্পাদন ব্যবহারের জন্য প্রস্তুত নয়।
বিল কারভিন

1
"সম্পূর্ণ-পাঠ্য সূচীটি কেবল মাইআইএসএএম দিয়েই সম্ভব, ইনোডিবি দিয়ে নয়": মাইএসকিউএল> = 5.6 এর পরে আর সত্য নয়। Dev.mysql.com/doc/refman/5.6/en/fulltext-search.html দেখুন ।
Hibou57

5

আমি বুঝতে পেরেছি যে মাইসাম লক করার বিষয়টি নিয়ে তর্ক থাকলেও, এটি দ্রুত ব্যবহার করা লক অধিগ্রহণ প্রকল্পের কারণে বেশিরভাগ পরিস্থিতিতে এটি ইনোডিবিয়ের চেয়ে দ্রুত faster আমি বেশ কয়েকবার ইনোডব চেষ্টা করেছি এবং সর্বদা এক কারণে বা অন্য কারণে মাই আইসামে ফিরে যাই। এছাড়াও InnoDB বিশাল লেখার লোডগুলিতে খুব সিপিইউ নিবিড় হতে পারে।


4

ডাটাবেস ব্যবহারের জন্য প্রতিটি অ্যাপ্লিকেশনের নিজস্ব পারফরম্যান্স প্রোফাইল রয়েছে এবং এটি সময়ের সাথে সাথে পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে।

আপনার বিকল্পগুলির পরীক্ষা করা আপনার পক্ষে সবচেয়ে ভাল কাজ। মাইআইএসএএম এবং ইনোডিবি-র মধ্যে স্যুইচ করা তুচ্ছ, সুতরাং আপনার সাইটের বিরুদ্ধে কিছু পরীক্ষার ডেটা এবং ফায়ার জিমটার লোড করুন এবং দেখুন কী ঘটে।


4

আমি মাইআইএসএএম এবং ইনোডিবি টেবিলগুলিতে এলোমেলো তথ্য সন্নিবেশ চালানোর চেষ্টা করেছি। ফলাফলটি বেশ মর্মাহত করেছিল। ইনোডিবি-র চেয়ে 10 মিলিয়ন সারি সন্নিবেশ করানোর জন্য মাইআইএসএএমের কয়েক সেকেন্ড কম প্রয়োজন!


2
আপনি যদি লেনদেন ব্যবহার করেন এবং InnoDB ইঞ্জিনের জন্য স্বতঃপরিচালনা বন্ধ করেন তবে আপনি একই কর্মক্ষমতা পাবেন।
stanleyxu2005

আইডিকে যদি একই পারফরম্যান্স হয় তবে আমি আরও জটিল অ্যাপ্লিকেশনগুলিতে এটি করি এবং এটি গতি বাড়ায়।
ব্যবহারকারী 965748

1
আপনি আপনার পরীক্ষার সঠিক বিশদ সরবরাহ করতে ব্যর্থ হয়েছেন - কোন কনফিগারেশন সেটিংস? টেবিলে (গুলি) আগে কী ছিল? কি ধরনের তথ্য? এবং সম্ভবত সবচেয়ে গুরুত্বপূর্ণ - সন্নিবেশ অনুক্রমিক ছিল? সমান্তরাল? তাদের সময় কি ছিল? সিপিইউ কোর কত? টপিক? ইত্যাদি
einpoklum

3

মাইসাম সেই ধরণের কাজের চাপের জন্য একটি এনজিওও (উচ্চ সমঝোতা লিখেছেন), আমি ইনোডাবের সাথে এতটা অভিজ্ঞতা অর্জন করতে পারি না (এটি 3 বার পরীক্ষা করে দেখেছি এবং প্রতিটি ক্ষেত্রে যে পারফরম্যান্স চুষে গেছে, তবে এটি শেষ পরীক্ষার পরে কিছুটা সময় হয়েছে) আপনি যদি মাইএসকিএল চালাতে বাধ্য করা হবে না, পোস্টগ্রাগেসকে একবার চেষ্টা করার বিষয়টি বিবেচনা করুন কারণ এটি সমবর্তী লেখাগুলিকে আরও ভালভাবে পরিচালনা করে


3

সংক্ষেপে, আপনি যদি এমন কোনও নির্ভরযোগ্য ডাটাবেসের প্রয়োজন যা এমন প্রচুর INSERT এবং আপডেটের নির্দেশনা পরিচালনা করতে পারে এমন বিষয়ে কাজ করে থাকেন তবে InnoDB ভাল।

এবং, মাইআইএসএএম ভাল যদি আপনার কোনও ডাটাবেসের প্রয়োজন হয় যা বেশিরভাগই টেবিল-লক জিনিসটিতে তার অপূর্ণতা বিবেচনা করে লেখার চেয়ে অনেকগুলি পড়ার (নির্বাচন) নির্দেশনা গ্রহণ করে।

আপনি চেক আউট করতে চাইতে পারেন;
পেশাদাররা এবং InnoDB কনস
পেশাদাররা এবং MyISAM কনস


2

আমি জানি এটি জনপ্রিয় হবে না তবে এখানে যায়:

মাইআইএসএএম-তে লেনদেন এবং রেফারেনশিয়াল অখণ্ডতার মতো ডাটাবেস প্রয়োজনীয়তার জন্য সমর্থন নেই যার ফলস্বরূপ চটকদার / বগি অ্যাপ্লিকেশনগুলির ফলাফল হয়। আপনার ডিবি ইঞ্জিন দ্বারা সমর্থিত না হলে আপনি সঠিক ডাটাবেস ডিজাইনের মৌলিক বিষয়গুলি শিখতে পারবেন না।

ডাটাবেস জগতে রেফারেন্সিয়াল অখণ্ডতা বা লেনদেন ব্যবহার না করা সফ্টওয়্যার বিশ্বে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ব্যবহার না করার মতো।

InnoDB এখন বিদ্যমান, পরিবর্তে এটি ব্যবহার করুন! এমনকি মাইএসকিউএল বিকাশকারীরা শেষ পর্যন্ত নতুন সংস্করণে এটি ডিফল্ট ইঞ্জিনে পরিবর্তন করতে স্বীকার করেছেন, যদিও মাইআইএসএএম মূল ইঞ্জিন যা সমস্ত উত্তরাধিকার ব্যবস্থায় ডিফল্ট ছিল।

আপনি পড়া বা লিখছেন বা আপনার কী পারফরম্যান্স বিবেচনা করেছেন তা বিবেচনাধীন নয়, মাইআইএসএএম ব্যবহার করার ফলে বিভিন্ন ধরণের সমস্যা দেখা দিতে পারে যেমন আমি সবেমাত্র চালিয়েছি: আমি একটি ডাটাবেস সিঙ্ক করছিলাম এবং একই সময়ে অন্য কেউ ছিলাম performing এমন কোনও অ্যাপ্লিকেশন অ্যাক্সেস করেছে যা মাইআইএসএএম-তে সেট করে একটি সারণী অ্যাক্সেস করেছে। লেনদেনের সহায়তার অভাব এবং এই ইঞ্জিনের সাধারণভাবে দুর্বল নির্ভরযোগ্যতার কারণে এটি পুরো ডাটাবেসটি ক্র্যাশ হয়ে গেছে এবং আমাকে ম্যানুয়ালি মাইএসকিএল পুনরায় চালু করতে হয়েছিল!

গত 15 বছরের বিকাশে আমি অনেক ডাটাবেস এবং ইঞ্জিন ব্যবহার করেছি। এই সময়ে আমার আইএএসএএম প্রায় এক ডজন বার ক্র্যাশ করেছিল, অন্যান্য ডাটাবেসগুলি, একবার মাত্র! এবং এটি ছিল একটি মাইক্রোসফ্ট এসকিউএল ডাটাবেস যেখানে কোনও বিকাশকারী দোষী সিএলআর কোড লিখেছিলেন (প্রচলিত ভাষা রানটাইম - মূলত সি # কোড যা ডাটাবেসের অভ্যন্তরে কার্যকর করে), এটি ডাটাবেস ইঞ্জিনের ঠিক ত্রুটি ছিল না।

আমি এখানে অন্যান্য উত্তরের সাথে একমত যা বলেছি যে মানের উচ্চ-প্রাপ্যতা, উচ্চ-কার্যকারিতা অ্যাপ্লিকেশনগুলি মাইআইএসএএম ব্যবহার করা উচিত নয় কারণ এটি কাজ করবে না, এটি হতাশামুক্ত অভিজ্ঞতার ফলে দৃ to় বা যথেষ্ট স্থিতিশীল নয়।আরও বিশদের জন্য বিল কারভিনের উত্তর দেখুন।

পিএস গোটা এটি পছন্দ করে যখন মাইআইএসএএম ফ্যানবোয় ডাউন ডাউন করে তবে আপনাকে এই উত্তরটির কোন অংশটি ভুল তা বলতে পারে না।


5
আমি ডাউনওয়েট করি নি, তবে আমি যদি তা করতাম তবে তা কখনই ব্যবহার না করার পরামর্শ দেওয়া হত। বিকাশকারীদের শব্দভাণ্ডারে শব্দটি কখনই হ্রাস করা উচিত নয় ... সতর্কতা 'কখনও কখনও বলবেন না' বলে মনে হচ্ছে।
হাবসন ব্রোপা

1

পড়ার / লেখার অনুপাতের জন্য আমি অনুমান করব ইনোডিবি আরও ভাল পারফর্ম করবে। যেহেতু আপনি নোংরা পড়াতে ভাল আছেন তাই আপনি কোনও গোলামের প্রতিরূপ তৈরি করতে এবং আপনার সমস্ত পাঠকে দাসের কাছে যেতে দিতে পারেন। এছাড়াও, একবারে একটি রেকর্ডের চেয়ে বাল্ক সন্নিবেশ বিবেচনা করুন।


1

প্রায়শই প্রতিবারই আমি কোনও নতুন প্রকল্প শুরু করি আমি এই একই প্রশ্নটিতে গুগল করে দেখি যে আমি কোনও নতুন উত্তর নিয়ে এসেছি কিনা।

এটি অবশেষে এটিকে সিদ্ধ করে দেয় - আমি মাইএসকিউএল এর সর্বশেষতম সংস্করণ নিয়েছি এবং পরীক্ষা চালাচ্ছি।

আমার কাছে টেবিল রয়েছে যেখানে আমি কী / মান লুকআপ করতে চাই ... এবং এগুলি সবই all হ্যাশ কীটির জন্য আমার মান (0-512 বাইট) পেতে হবে। এই ডিবিতে খুব বেশি লেনদেন হয় না। সারণী মাঝে মধ্যে আপডেট হয় (এটি সম্পূর্ণরূপে) তবে 0 টি লেনদেন।

সুতরাং আমরা এখানে একটি জটিল সিস্টেমের কথা বলছি না, আমরা একটি সাধারণ অনুসন্ধানের কথা বলছি, .. এবং কীভাবে (টেবিলের র‌্যামের বাসিন্দা তৈরি করা ছাড়াও) আমরা পারফরম্যান্সকে অনুকূল করতে পারি।

আমি কোথাও কোনও সুবিধা পেতে পারি কিনা তা দেখার জন্য আমি অন্যান্য ডাটাবেসগুলিতে (যেমন NoSQL) পরীক্ষাও করি। আমি যে সর্বাধিক সুবিধা পেয়েছি তা হ'ল কী ম্যাপিং হচ্ছে তবে যতক্ষণ পর্যন্ত অনুসন্ধানটি দেখা যায় মাইআইএসএএম বর্তমানে তাদের সকলকে শীর্ষে রাখছে।

যাইহোক, আমি মাইআইএসএএম টেবিলগুলির সাথে আর্থিক লেনদেন করবো না তবে সরল সন্ধানের জন্য আপনার এটি পরীক্ষা করা উচিত .. সাধারণত 2x থেকে 5x প্রশ্নগুলি / সেকেন্ডে।

এটি পরীক্ষা, আমি বিতর্ক স্বাগত জানাই।


1

যদি এটি 70% সন্নিবেশ করানো হয় এবং 30% পঠিত হয় তবে এটি InnoDB দিকের মতো।


0

নিম্নরেখা: আপনি যদি ডেটা বড় অংশে বাছাই করে অফলাইনে কাজ করছেন তবে মাইআইএসএএম সম্ভবত আপনাকে আরও ভাল (আরও ভাল) গতি দেবে।

কিছু পরিস্থিতি আছে যখন মাইআইএসএএম ইনোডিবি-র তুলনায় অসীমভাবে কার্যকর large

উদাহরণস্বরূপ: আমি NOAA থেকে একটি সিএসভি ফাইল (15 এম রেকর্ডস) রূপান্তর করছিলাম যা ভিচ্চার ক্ষেত্রগুলি কী হিসাবে ব্যবহার করে। InnoDB চিরকালের জন্য নিচ্ছিল, এমনকি বিশাল পরিমাণ স্মৃতি উপলব্ধ রয়েছে।

এটি সিএসভির একটি উদাহরণ (প্রথম এবং তৃতীয় ক্ষেত্রগুলি কীগুলি)।

USC00178998,20130101,TMAX,-22,,,7,0700
USC00178998,20130101,TMIN,-117,,,7,0700
USC00178998,20130101,TOBS,-28,,,7,0700
USC00178998,20130101,PRCP,0,T,,7,0700
USC00178998,20130101,SNOW,0,T,,7,

যেহেতু আমার যা করা দরকার তা পর্যবেক্ষণ করা আবহাওয়ার ঘটনাগুলির ব্যাচের অফলাইন আপডেট চালানো, তাই আমি ডেটা প্রাপ্ত করার জন্য মাইআইএসএএম টেবিলটি ব্যবহার করি এবং কীগুলিতে যোগদান করি যাতে আমি আগত ফাইলটি পরিষ্কার করতে পারি এবং ভিআচআরএআর ক্ষেত্রগুলি INT কীগুলির সাথে প্রতিস্থাপন করতে পারি (যা সম্পর্কিত বাহ্যিক সারণী যেখানে মূল VARCHAR মান সংরক্ষণ করা হয়)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.