تفاوت ها و مقایسه موتورهای ذخیره سازی InnoDB و MyISAM در MySQL
تفاوت ها و مقایسه موتورهای ذخیره سازی InnoDB و MyISAM در MySQL
موتور ذخیره سازی چه وظایفی دارد؟
موتورهای ذخیره سازی مسئول ایجاد، بروزرسانی، حذف و مشاهده اطلاعات (CRUD)در جداول پایگاه داد می باشند. در پایگاه داده MySQL دو موتور ذخیره سازی InnoDB و MyISAM وجود دارد که در بخش های بعد تفاوت های آنها بررسی می گردد.
سرعت دسترسی به داده ها
هر جدول InnoDB یک اندیس خاص بنام اندیس خوشه ای (clusterd index) دارد که رکوردها در آن ذخیره می شوند. دسترسی به داده ها از طریق اندیس جستجو به این علت سریعتر است که داده های هر رکورد و اندیس جستجوی آن در یک صفحه قرار دارند. در جداول بزرگ، ساختار اندیس خوشه ای اغلب باعث کاهش عملیات I/O نسبت به ساختارهایی که اندیس و داده در صفحات متفاوتی قرار دارند می شود. MyISAM از یک فایل جهت ذخیره رکوردها و فایل دیگری جهت اندیس ها استفاده می کند.
در InnoDB اندیس خوشه ای بر اساس کلید اصلی ایجاد می شود. در بخش اندیس های ثانویه (secondary indexes) نیز InnoDB عملکرد بهتری دارد. این اندیس ها علاوه بر ستون های خود، ستون های کلید اصلی را نیز در بر می گیرند و InnoDB از مقدار کلید اصلی برای جستجو در اندیس خوشه ای استفاده می کند.
در MySQL جهت افزایش سرعت و کارایی، داده ها در بافرهای حافظه کش می شوند. MyISAM از بافرهای خاصی بنام Key cache به منظور کش کردن اندیس ها استفاده می کند و برای کش کردن داده های دیگر از بافرهای حافظه سیستم عامل استفاده می کند. در مقابل InnoDB اندیس ها و داده ها را در فضایی موسوم به buffer pool و در قالب درخت های B-Treeکش می کند.
پشتیبانی از تراکنش ها
طراحی InnoDB بر اساس مدل ACID است که تراکنش ها با قابلیت هایی همچون commit ، roll back و بازیابی در زمان کرش را پشتیبانی می کند. در InnoDB با فعال بودن حالت autocommit ، تمام فعالیت کاربر درون تراکش انجام می گیرد. اگر autocommit فعال نباشد می توان بصورت دستی از commit و roll back استفاده نمود. Commit تغییرات انجام شده در تراکنش فعلی را بصورت دائمی ثبت می کند و roll back تمام تغییرات تراکنش جاری را لغو می کند.
در مقابل، موتور MyISAM از تراکنش ها پشتیبانی نمی کند.
موازی سازی
یکی از مشکلات بزرگ MyISAM نداشتن قابلیت قفل کردن سطح ردیف داده است. در InnoDB هنگامی که تعداد زیادی عملیات نوشتن وجود دارد با توجه به قفل سطح ردیف، این عملیات می توانند بطور همزمان اجرا شوند اما قابلیت قفل کردن سطح جدول در MyISAM اجازه چنین کاری را نمی دهد. InnoDB در سطوح بالای موازی سازی مشکل قفل کردن دو به دو ناسازگار را دارد ولی باز هم برای این موضوع استفاده می شود.
پایداری و نگهداری
دیتابیس ها در اثر کرش کردن یا خراب شدن سخت افزار ممکن است دچار آسیب دیدگی شوند. موتور MyISAM بسادگی تحت تاثیر این عوامل قرار می گیرد و بدلیل عدم وجود مکانیزمی که به یکپارچه سازی داده ها کمک کند، نیاز به repair دارد و ضمنا هیچ ضمانتی برای بازیابی کامل داده ها وجود ندارد. اما InnoDB بگونه ای طراحی شده که دوام و پایداری را تضمین کند و خصوصا هنگام وقوع مشکلات سخت افزاری تا حد زیادی خرابی داده ها را کاهش می هد.
ایجاد فایل های پشتیبان (Back-up)
در InnoDB می توان بسادگی در حین فعالیت دیتابیس نسخه پشتیبان تهیه کرد. به این روش اصطلاحا hot back-up گفته می شود. اما در MyISAM ایجاد فایل پشتیبان منجر به قفل شدن جداول و Read only شدن آنها می گردد. در مقیاس بزرگ تکنیک replication و ایجاد یک سرور دیگر برای غلبه بر این مشکل MyISAM بکار می رود.
در تکنیک replication یک سرور Master و چندین سرور Slave داریم. تمام عملیاتی که منجر به تغییر دیتابیس می شوند فقط بر روی سرور Master اجرا شده و یک log از آنها ایجاد می شود. سپس سرورهای Slave به کمک این log خود را با سرور Master سینک (همگام) می کنند. در حالت معمول سرورهای Slave تنها جهت خواندن اطلاعات استفاده می شوند. هر یک از سرور های Slave نقش یک نسخه پشتیبان از اطلاعات دیتابیس را دارند و راهکاری جهت حل مشکل پشتیبان گیری آنلاین موتور MyISAM محسوب می گردد.
تفاوت های دیگر
· ذخیره تعداد رکوردها
در InnoDB بر خلاف MyISAM تعداد رکوردها ذخیره نمی شود و از دستور count جهت تعیین تعداد رکوردها استفاده می شود. استفاده از این دستور با شرط where معمول است اما بدون این شرط زمانبر است و بهتر است روش های جایگزین استفاده گردد.
· خاصیت Full text در اندیس ها
جستجوی Full text برخلاف like که بر روی کاراکترها عمل می کند، پرس و جو را روی کلمات انجام می دهد. بعنوان مثال اگر در جستجوی یک ترکیب بر روی چندین میلیون رکورد باشیم، با like ممکن است چندین دقیقه ولی با Full text search طی چند ثانیه انجام می شود.
در تمام نسخه های MyISAM، اندیس ها از Full text پشتیبانی می کنند اما تنها از MySQL 5.6.4 به بعد در موتور InnoDB می توان از جستجوی Full text بر روی اندیس ها بهره گرفت. در حال حاضر بصورت گسترده از این خاصیت InnoDB استفاده نمی شود.
اطلاعات کاملتر در وب سایت : https://www.percona.com/blog/2013/05/22/mysql-and-the-ssb-part-2-myisam-vs-innodb-low-concurrency
نظر بدهید