MyISAM
سرعت بالا در خواندن داده های ذخیره شده
سرعت پایین در درج داده ی جدید در حالت concurrency (هم زمانی)
کرش کردن جدول
دلیل بالا بودن سرعت خواندن اطلاعات برمیگرده به نحوه ی ذخیره سازی index ها و خواندن آن. در این موتور هر ورودی به یک رکورد موجود در data file اشاره می کند، و این اشاره گر آفستی است از ابتدای فایل. به زبان دیگر هر کدام از ورودی های index مستقیما به کل رکورد اشاره دارند و در هنگام خواندن index، موتور فقط یک بار داده را از فایل .MYI خوانده و در key_buffer_size قرار می دهد.
این ساختار ساده هنگامی بیشترین بازدهی را دارد که نوع ROW_FORMAT برابر با FIXED باشد. (در مقاله ی دیگر توضیحات کاملی در ارتباط با ROW_FORMAT) خواهم داد.
اما مشکل اصلی این موتور نوشتن به صورت هم زمان هست. نوع Lock کردن جدول در موتور MyISAM به صورت Table Level lock هستش. یعنی در زمانی که یک رکورد در حال insert شدن در جدول هست، دیگر insert های همزمان به حالت Waiting خواهند رفت. به زبان ساده شما در آن واحد فقط توانایی درج یک رکورد در سیستم را دارید.
به همین دلیل هست که جداول از نوع MyISAM همیشه تعداد دقیق رکورد های موجود رو دارند و در هنگام اجرای Query بدون شرط Select count(*) from x در زمان کمتر از ۱ ثانیه نتیجه را نمایش میدهند.
اما ضعف دیگر این موتور کرش کردن جدول در هنگام رخ دادن اتفاقات غیر قابل پیشبینی هستش. برای مثال اگر یک دستور DDL روی جدولی در حال اجرا باشد و این دستور kill شود باعث کرش کردن جدول میشود.
InnoDB
موتور InnoDB ساختار پیچیده تری نسبت به MyISAM دارد.
اصلی ترین ویژگی این موتور داشتن خاصیت Transaction در حالت MVCC هستش.
همچنین این موتور توانایی ذخیره سازی رکورد های جدید به صورت concurrency (هم زمانی) را با بهترین حالت ممکن دارد.
با توجه به Lock شدن جدول به صورت Row level lock توانایی انجام همزمان انواع Query ها مانند Insert Delete Update را دارد. البته Row Level Lock خود دارای شرایطی می باشد و همزمان اجرا شدن Query ها مستلزم داشتن این شرایط هست.
سرعت خواندن در این سیستم به نسبت MyISAM با توجه به نوع Index کردن رکورد ها پایین تر هستش. البته این موضوع قطعی نیست طراحی صحیح جدول و index و همچنین Tune بودن متغیر های مرتبط با Innodb باعث سریع تر شدن خواندن داده ها در InnoDB میشود.
نکته ی مهم دیگر امن بودن این موتور در برابر کرش هستش. با توجه به نوع ذخیره سازی داده در این موتور، موتور در برابر کرش کردن امن است.
از کدوم موتور در کجا استفاده کنیم؟
اگر سیستم شما load بسیار بالایی در خواندن داده به نسبت نوشتن دارد از MyISAM استفاده کنید.
اگر قصد ساختن یک data warehouse دارید از MyISAM استفاده کنید.
اگر سیستم شما تک کاربره در هنگام نوشتن هست از MyISAM استفاده کنید.
اگر کرش کردن جدول هزینه ای برای شما ندارد از MyISAM استفاده کنید.
اگر سیستم شما load بالایی در نوشتن و یا هر دو(نوشتن و خواندن) دارد از InnoDB استفاده کنید.
اگر صحت و سلامت داده برای شما دارای اهمیت بالایی هست از InnoDB استفاده کنید.
بحث تفاوت های این دو موتور بسیار فراتر از حوصله این مقاله هستش. هدف از این مقاله شرح اهمیت انتخاب صحیح موتور جدول در هنگام طراحی هستش. شاخص های فراوانی هنگام انتخاب موتور یک جدول می باشد که با جستجو قابل مشاهده هستند.
منبع: hellodigi