مزایا و معایت MySQL InnoDB

Image تحقیقات

مزایا و معایت MySQL InnoDB

سلام خدمت دوستان خوبم

امروز می خواهم کمی درباره مزایا و معایت جدول هایی از نوع  MySQL در  InnoDB صحبت کنم .

همانطور که می دانید در دیتابیسMySQL می توانیم برای جداول Storage Engine های مختلفی را تعیین نماییم که یکی از آنها InnoDB  است .

خب بریم سراع مزایای  InnoDB است .

 

۱- Transactions

یک Transaction یک مجموعه ای از یک یا چندین عبارت SQL می باشد که یک مجموعه فعالیت های مرتبط به هم را اجرا می کنند که یا همه این دستورات باید با هم اجرا شود یا هیچ کدام از انها اجرا نشود . این تعریفی از یک Transaction و کاربرد آن رد MYSQL بود .

InnoDB بر خلاف MyISAM  از Transactions به خوبی پشتیبانی می کند .

 

۲ – Row-level locking

بعضی وقت ها نیاز هست وقتی در جدول مورد نظر  روی یک سطر خاص insert , update و…. اتفاق می افتد .اون سطر مورد نظر توسط شخص دیگر یا query دیگری در دسترس نباشد و حتی خوانده نشود . در MyISAM این کار را با قفل کردن کل جدول انجام می دهیم ولی درInnoDB می توانیم فقط همان سطر را قفل نماییم که به آن Row-level locking  می گویند . بعد از قفل کردن سطر , هر درخواستی بیاید در صف قرار خواهد گرفت تا آن سطر باز شود و کوئری ها انجام شوند .

 

۳- Deadlock Detection

به معنی رفع بن بست می باشد  .بن بست یعنی درخواست A رکورد شماره ی ۵ را قفل کرده و رکورد شماره ی ۶ را نیاز دارد. همچنین درخواست B رکورد شماره ۶ را قفل کرده و رکورد ۵ را نیاز دارد (برعکس درخواست A) . در این حال می گوییم بن بست رخ داده و رکورد A و B منتظر هم می باشند . در این حالت در InnoDB منابع لازم یکی از درخواست ها را آزاد می کند تا کار دنبال شود و این بن بست حل شود .

در واقع این بن بست ها بیشتر در transactions ها اتفاق می افتد که دو  یا چند transaction منابعی را برای خود نگه داشتند و رها نکرده اند . این بن بست ها یک تیکه جدایی ناپذیر درMYSQL می باشند . برای رفع این بن بستMYSQL یکی از transaction ها را با استفاده از الگوریتم خود انتخاب  و آن را rollback می کند . با این کار بقیه transaction ها می توانند به کار خود ادامه دهند .

 

۴ –  foreign key constraints

تعریف کلید خارجی در جدول . همانطور که می دانید کلید خارجی برای ارتباط بین دو جدول می باشد . فرض می کنیم در پروژه ی کتابخانه , بین جدول کابران و کتاب ها با استفاده از کلید خارجی ارتباط بر قرار کردیم .در این حالت می توانیم چک کنیم تا موقعی که تمام کتاب ها توسط کاربر برگشت داده نشده است , آن کاربر را نتوان در سیستم حذف کرد .

 

۵ – crash recovery 

یک وقت هایی ممکن است دیتابیس شما crashe بکند مثلا سرور MYSQL هنگ بکنه و شما آن را ریستارت نمایید . بعد از اینکه crashe  اتفاق می افتد , جداول InnoDB خیلی سریع  و به صورت خودکار به آخرین وضعیت پایداری که قبلن داشتند بر می گردند .

حالا بریم سراغ معایت InnoDB .

۱- Tablespaces

وقتی از MyISAM استفاده کنید هر جدول در فایل مخصوص به خودش ایجاد و نگهداری می شود و اگر نیاز به رشد داشته باشد , آن فایل سایز اش بزرگ تر می شود و اگر جدول کوچک تر شود , متقابلاً سایز آن فایل نیز کم می شود .

اما InnoDB تمام اطلاعات جداول و اندکس ها و …  را داخل مفهمومی به اسم Tablespaces ذخیره می کند .  به همین دلیل اطلاعات جداول InnoDB را با کپی پیست معمولی در سیستم دیگر دسترسی داشته باشید .

 

۲ – پیچیدگی بیشتر نسب به MyISAM

ایجاد جدول InnoDB به دلیل قید و بند های اضافی ای که دارد نسبت به MyISAM پیچیده تر است . و این پیچیدگی مخصوصا برای آنهایی که تازه شروع به کار کردند , خودش را بیشتر نشان می دهد  و در MyISAM طراح دیتابیس مثلا با کلید خارجی دیگر کاری ندارد .

 

۳ – پشتیبانی نکردن از full-text search

در جداول InnoDB نمی توان از جستجوی full-text  استفاده کرد   و  full-text search مخصوص MyISAM می باشد .

در full-text search  مثلا می توانیم بگوییم دیتایی را به من بده که درصد تشابه آن با کلمه ی Ali بیشتر از ۷۰ درصد باشد .

 از ورژن ۵.۶.۴ به بعد ,MYSQL در جداول  InnoDB از full-text search  پشتیبانی می کند .

InnoDB support for FULLTEXT indexes is available in MySQL 5.6.4 and higher.

 

۴- performance پایین تر نسبت به MyISAM

جداول MyISAM معمولا نسبت به InnoDB سریع تر هستند زیرا خیلی از موارد مانند کلید خارجی و  Transactions  ها را چک نمیکند . همچنین به همین دلیل , جداول InnoDB , رم و resources  بیشتری مصرف می کنند . و توصیه میشود اگر دلیل قانع کننده ای برای استفاده از InnoDB ندارید اصلن به سراغ آن نروید .

نتیجه گیری :

خب بالاخره از MyISAM استفاده کنیم یا InnoDB . ؟

حقیقتش اینه هر کدوم موارد خاص خودشون را دارند . مثلا InnoDB برای جداولی مناسب است که inserts و updates های متناوب و زیادی دارند زیرا در MyISAM برای هر   inserts و updates  یک بار جدول قفل  (locked) می شود .

MyISAM برای جداولی مناسب است که select زیادی روشون انجام می شود .

InnoDB قطعا برای پروژه های مانند فروشگاه آنلاین یا برنامه های مالی و …. که data integrity در آن ضرورت دارد , انتخاب مناسبی می باشد .  تعریف جداول در InnoDB پیچیده تر است ولی باعث می شود ساختار دیتابیس محکم تر شود و در خیلی از مواقع باعث کد نویسی کمتر سمت سرور می شود .

خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.