برنامه نویسی

تفاوت تفاوت myISAM و innoDB و innoDB کدام بهتر است ؟

امتیاز کاربران

ستاره فعالستاره فعالستاره فعالستاره فعالستاره فعال
 

سلام به کاربران خوب سایت انتخاب صحیح موتور مناسب میتونه خیلی بر روی بازدهی نرم افزار و سرویس ها تاثیر مثبتی داشته باشه و عدم انتخاب صحیح میتونه در دراز مدت مشکلات زیادی رو برای سیستم به وجود بیاره.
دو موتور InnoDB و MyISAM از پراستفاده ترین موتور های موجود در MySQL هستند.

ر این مقاله قصد دارم نگاه کوتاهی به تفاوت های اصلی این دو موتور و مزایا و معایب هر یک رو توضیح بدم. تفاوت های ساختاری هر یک رو در پست های بعدی شرح میدم.
در ادامه با من همراه باشید.
تا قبل از انتشار نسخه ی MySQL 5.6 موتور MyISAM به عنوان موتور پیش فرض این دیتابیس قرار داشت. از ورژن ۵٫۶ به بعد Oracle موتور InnoDB رو به عنوان موتور پیش فرض قرار داد، اما این به معنای منسوخ شدن MyISAM نبوده.
 
MyISAM
 
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 استفاده کنید.
بحث تفاوت های این دو موتور بسیار فراتر از حوصله این مقاله هستش. هدف از این مقاله شرح اهمیت انتخاب صحیح موتور جدول در هنگام طراحی هستش. شاخص های فراوانی هنگام انتخاب موتور یک جدول می باشد که با جستجو قابل مشاهده هستند.

تمام حقوق سایت برای سلام دیجی و نويسندگان آن محفوظ می باشد