وقتی جدولی در MySQL ایجاد می کنید، می توانید یک موتور ذخیره سازی را برای جدول موردنظر انتخاب کنید. استفاده از موتور ذخیره سازی روشی است که داده های جدول را در فایل ها ذخیره می کند. به صورت کلی چندین موتور ذخیره سازی مختلف وجود دارد، اما موتورهایی که بیشتر مورد استفاده قرار می گیرند MyISAM و InnoDB هستند که هر یک موتور ذخیره سازی پیش فرض در نسخه های مختلف MySQL هستند. اگر هنگام ایجاد جدول، موتور ذخیره سازی را مشخص نکنید، از موتور پیش فرض نسخه MySQL شما استفاده می شود. در نسخه های پایین تر از 5.5.5 ، MyISAM پیش فرض می باشد، اما در نسخه های 5.5.5 و بالاتر، InnoDB پیش فرض است. در بیشتر موارد، MyISAM توصیه می شود، اما حالاتی وجود دارد که برای یک جدول خاص ممکن است نیاز باشد از InnoDB استفاده کنید. InnoDB یک موتور جایگزین داخلی برای MySQL است که برای پایگاه داده های با کارایی بالا در نظر گرفته شده است.


چه زمانی باید از MyISAM به جای InnoDB استفاده کرد

با مقایسه دو موتور ذخیره سازی، به تفاوت های عمده ای بین InnoDB و MyISAM می رسید. یک برنامه یا وب سایتی که دارای یک جدول پرکاربرد است با استفاده از موتور ذخیره سازی InnoDB میتواند table-locking را به خوبی انجام داده و به طرز فوق العاده ای عملکرد مطلوبی داشته باشد. با این حال، هیچکدام از آنها در همه شرایط کامل نیستند. نقاط قوت و محدودیت های مختلفی برای هر دو موتور ذخیره سازی وجود دارد. آگاهی دقیق از ساختار پایگاه داده و شیوه های پرس و جو برای انتخاب بهترین موتور ذخیره سازی برای جداول شما بسیار مهم است.

موتور MyISAM همواره به عنوان موتوری دیده می شود که جستجوی SELECT را سریعتر انجام می دهد، مدیریت آن آسان تر است، داده ها را پشتیبان گیری و بازسازی می کند. از طرف دیگر، InnoDB کندتر اما از transactions و foreign keys پشتیبانی می کند.


کدام موتور را برای پایگاه داده انتخاب کنید؟ MyISAM یا InnoDB؟

پاسخ به این سوال ساده نیست، زیرابه اهداف استفاده از پایگاه داده بستگی دارد، اینکه آیا در هنگام بارگیری رکوردها به یکپارچگی داده ها اهمیت داده می شود یا به عملکرد آن توجه دارید یا خیر.

InnoDB فرآیند بازیابی خرابی خودکار دارد. وقتی mysql به طور غیر منتظره متوقف می شود، InnoDB چک لیست های خاصی دارد که در هنگام راه اندازی mysql اجرا می شود. در بیشتر موارد، این روند بازیابی خرابی با موفقیت تغییرات انجام شده قبل از خرابی را خاتمه می دهد و تغییراتی را که در حال انجام بوده اما تایید نشده است، برمی گرداند. البته این مورد به صورت صددرصد نیست و در برخی موارد به درستی عمل نمی کند که به عوامل مختلفی بستگی دارد.

بعلاوه، اگر InnoDB خراب شود و قادر به بازیابی خودکار نباشد، ممکن است برخی از جداول InnoDB به روشی غیر قابل ترمیم خراب شوند. این دلیل دیگری است که داشتن پشتیبان گیری خودکار برای هر حساب با استفاده از جداول InnoDB از اهمیت ویژه ای برخوردار است.


قابلیت اطمینان

MyISAM هیچ یکپارچگی داده ای را ارائه نمی دهد. خرابی های سخت افزاری، خاموش کردن دیتابیس به صورت نا امن و عملیات لغو شده می توانند باعث خراب شدن داده ها شوند. این امر نیاز به تعمیر کامل یا بازسازی index ها و جداول دارد.

از طرف دیگر، InnoDB برای جلوگیری از خراب شدن داده ها، از یک transactional log ، double-write buffer همچنین یک چک خودکار و اعتبار سنجی استفاده می کند. قبل از اینکه InnoDB تغییری ایجاد کند، داده ها را در یک فایل tablespace به نام ibdata1 ضبط می کند. اگر خرابی رخ دهد، InnoDB به طور خودکار آنها را بازیابی می نماید.


قفل کردن (Locking)

قفل کردن در MySQL گزینه ای است که از تغییر همزمان داده های دو یا چند کاربر جلوگیری می کند. هنگام فعال شدن گزینه Locking، کاربر نمی تواند داده ها را تغییر دهد. این ویژگی اعتبار کلیه داده ها را حفظ می کند.

MyISAM از table locking به عنوان روش پیش فرض قفل کردن استفاده می کند. لذا به یک session واحد اجازه می دهد تا جداول را همزمان تغییر دهد. جداول همیشه به همان ترتیب قفل می شوند. روش table locking برای پایگاه های داده read-only که به حافظه زیادی احتیاج ندارند، مناسب است.


نمونه ای از قفل کردن جدول: 

تفاوت MyISAM و InnoDB


موتور InnoDB توانایی ذخیره سازی رکورد های جدید به صورت هم زمان را با بهترین حالت ممکن دارد. همچنین با توجه به Lock شدن جدول به صورت Row level lock توانایی انجام همزمان انواع Query ها مانند Insert Delete Update را خواهد داشت. البته Row Level Lock خود دارای شرایطی می باشد و همزمان اجرا شدن Query ها مستلزم داشتن این شرایط می باشد.

سرعت خواندن در این سیستم به نسبت MyISAM با توجه به نوع Index کردن رکورد ها پایین تر می باشد. البته طراحی صحیح جدول و index و همچنین Tune بودن متغیر های مرتبط با Innodb باعث سریع تر شدن خواندن داده ها در InnoDB می شود.

نکته ی مهم دیگر امن بودن این موتور در برابر کرش کردن می باشد. با توجه به نوع ذخیره سازی داده در این موتور، موتور در برابر کرش کردن امن است.


نمونه ای از row-level locking در Innodb

تفاوت MyISAM و InnoDB

تصویر(2)

خلاصه: MyISAM از table locking استفاده می کند، در حالی که InnoDB از row-level locking به عنوان روش پیش فرض استفاده می کند.


ذخیره سازی

InnoDB به حافظه زیادی نیاز دارد (buffer pool). داده ها و index ها در حافظه ذخیره می شوند. تغییرات در log buffer (حافظه فیزیکی) نوشته می شوند و هر ثانیه به تعداد پرونده ها افزوده می شود (این روش بستگی به مقدار innodb_flush_log_at_trx_commit دارد). داشتن داده های زیاد در حافظه باعث بهتر شدن عملکرد دیتابیس می شود. MyISAM فقط شاخص ها (key_buffer_size) را ذخیره می کند، بنابراین اگر فقط از MyISAM استفاده می کنید، به حافظه زیادی نیاز نخواهید داشت.


خاصیت ACID

InnoDB از ACID (Atomicity, Consistency, Isolation, and Durability) پشتیبانی می کند در حالی که MyISAM از ویژگی ACID پشتیبانی نمی کند.


آیا باید از InnoDB برای WordPress ،Magento یا Joomla استفاده کرد؟

در بیشتر موارد، پاسخ مثبت است. اکثر کاربرانی که از سیستم های مدیریت محتوا مانند وردپرس، مجنتو و جوملا استفاده می کنند دانش محدودی در مورد مولفه های اصلی پایگاه داده و کدهای مربوطه دارند تا بتوانند آگاهانه در مورد موتورهای ذخیره سازی تصمیم گیری کنند. اکثر مشکلات table-locking این سیستم های مدیریت محتوا (CMS) به طور کلی با تغییر تمام جداول سایت به جای MyISAM پیش فرض، به InnoDB برطرف می شوند. اگر از این نوع CMS ها بر روی سرور خود میزبانی می کنید، تغییر موتور ذخیره سازی پیش فرض در MySQL برای استفاده از InnoDB مفید خواهد بود، بنابراین جداول جدید به صورت پیشفرض با InnoDB ایجاد می شوند.


مزایای MyISAM

  • خواندن سریع جداول
  • پشتیبان گیری ساده تر
  • مناسب برای جداول با مقدار کمی داده

معایب

  • عدم وجود ویژگی Transaction
  • فقدان مکانیزم مسئول برای یکپارچگی داده ها
  • برای جداول بزرگ، زمان طولانی برای ترمیم دیتابیس بعد از خرابی سرور نیاز است



مزایای InnoDB 

  • پشتیبانی از ویژگی transaction
  • یکپارچگی داده ها را تضمین می کند
  • موتور پیش فرض از MySQL 5.5 و بالاتر پشتیبانی می نماید
  • در هنگام تکثیر master-slave بهتر کار می کند

معایب

  • خواندن داده ها را کندتر انجام می شود
  • مشکلات در تهیه نسخه پشتیبان