چرا باید از InnoDB استفاده کرد؟
بسیاری از طراحان بانکهای اطلاعاتی، موتور InnoDB را از همه نظر مورد بررسی قرار میدهند بجز سرعت. آنان معتقدند این موتور در مقایسه با MyISAM حرفی برای گفتن ندارد؛ در حالیکه تمام این اطلاعات از طریق شایعات بیپایه و اساس شکل گرفته است. در واقعیت، نمیتوان موت وری را پیدا کرد که مناسب استفاده در محیط عملیاتی باشد و میزان مصرف حافظه آن به اندازه InnoDB بهینه باشد.
هر چند گاهیاوقات موتور InnoDB بازدهی بهینهای ندارد اما برای اموری که مرتبط با پردازش تراکنشهای برخط (OLTP) میشود، بهترین گزینه است.
بازدهی
از نظر بازدهی، آزمایشهای مختلفی روی این موتور انجام گرفته و نتایج معتبری مبنی بر بازدهی مناسب آن منتشر شده است. وبسایت MySQLPerformanceBlog.comکه یکی از شرکتهای فعال در زمینه بهبود موتورهای مایسهکوئل است، با به راهاندازی تست آزمایشگاهی میان Falcon ،MyISAM و InnoDB قصد داشت موتور فالکون را بهعنوان موتور بهتر معرفی کند در حالی که InnoDB بهترین نتایج را بهدست آورد.
یکی از نقاط مهم پیادهسازی InnoDB در اندیسهای خوشهای آن است. به این معنا که دادههای جداول در حقیقت در برگهای اندیسهای کلید اصلی ذخیره میشوند و بنابراین نیازی نیست اطلاعات ردیف را بهصورت جداگانه واکشی کرد. همچنین این موضوع باعث اشغال فضای بیشتر میشود. وقتی از موتوری مانند MyISAM استفاده میکنید، مقدار کلید-بافر نیز همزمان با اندیس جدول بارگذاری میشود، اما InnoDB درست نقطه مقابل آن است و هنگام بافر کردن اندیس، خود بهصورت ضمنی دادهها را نیز در جدول بافر میکند و میتوان این مقدار را با تغییر تنظیم innodb_buffer_pool به میزان دلخواه تغییر داد. این اقدام باعث میشود بازدهی بسیار بالاتر برود اما در مقایسه، فضای حافظه بیشتری از سیستم مصرف شود.
تکنیک خوشهبندی (کلاسترینگ) کلیدهای اصلی یکی از دلایل فاصله زیاد بین MyISAM و InnoDB در این آزمایش است. نکته قابل توجه این است که InnoDB در بخش اندیس دوم نیز از MyISAM بهتر عمل میکند. به این ترتیب بازدهی این موتور نهتنها در بخش خوشهبندی کلیدها است، بلکه در هر کوئری ارسال شده نیز سریعتر است.
این موتور از ترفندهای دیگری هم برای اندیسها استفاده میکند بهطوری که برای کوئریهای مرتب، جدولی از اندیسهای انطباقی درست میکند. اندیسهای جدول انطباقی نسبت به درخت Btree بسیار سریعتر هستند. دوباره باید اشاره کرد که این بازدهی بالا منجر به افزایش مصرف حافظه میشود.
همچنین در آزمایشهای انجام شده میتوان دریافت که InnoDB با بزرگ شدن سیستم و بالا رفتن تعداد تراکنشهای همزمان دچار مشکل میشود. این مشکل توسط تیم توسعه این موتور پذیرفته شده و قرار است در نگارشهای بعدی رفع شود. با وجود چنین مشکلی، InnoDB اغلب برای فعال کردن موازیسازی بهکار میرود.
موازیسازی
نکته جالب این است که InnoDB در پیادهسازی سطوح بالای موازیسازی مشکل قفل کردن دوبهدو ناسازگار را دارد ولی باز هم برای این موضوع استفاده میشود. یکی از بزرگترین مشکلات MyISAM نداشتن قابلیت قفل کردن سطح ردیف داده است. به این ترتیب در نقاطی که این مساله نیاز است، بهاجبار از قفل کردن سطح جدول استفاده میکنند.
پایداری
همه مدیران پایگاههای دادهای حتما این کابوس را دیدهاند که در حال پاسخ به تماس مشتری هستند و به وی میگویند دادههایش خراب شده یا کاملا از دست رفته است. موتور MyISAM در اینجور مواقع کمکی نمیکند و هیچ مکانیزمی برای حفظ یکپارچگی دادهها ندارد. خرابی سختافزار، خاموش کردن ناگهانی سیستم و عملیات لغو شده باعث میشود دادههای موتور MyISAM بسادگی در معرض خطر خراب شدن قرار بگیرند. البته ابزارهای خوبی برای بازیابی در این شرایط برای این موتور نوشته شده است، اما هیچکدام از این ابزارها ضمانت نمیکنند که همه دادهها را صحیح و سالم برگردانند و بهکارگیری آنها هم مستلزم چند ساعت در دسترس نبودن سرور است.
اما InnoDB بهطور کامل از ACID پشتیبانی میکند و طوری طراحی شده که دوام و پایداری اطلاعات را تضمین کند. اموری از جمله کدگذاری اطلاعات را هم بهصورت خودکار انجام میدهد و صـــحت اطـلاعات موجود در صفحههای پایگاه داده را میسنجد. هر چند این تدابیر امنیتی در خاموشیهای ناگهانی تاثیری ندارند، ولی میتوانند مشکلات سختافزاری را کاملا از بین ببرند و خرابی دادهها را تا حد ممکن کاهش دهند.
دروپال یکی از سیستمهای مدیریت محتوای معروف منبعباز و سازمانی است که کاربرد زیادی در داخل و خارج از کشور دارد. در گزارشی از تیم توسعه و تحقیقات این گروه آمده است بهدنبال پایین آمدن سرور در سال 2007، پایگاه داده اصلی سایت از دسترس خارج شده بود. بعد از مشاهده سیاهه اعمال مایسهکوئل، روشن شد که پایگاه داده ایرادی نداشته، بلکه InnoDB میان داده موجود در حافظه اصلی و داده موجود روی دیسک تناقضی پیدا کرده که نشان دهنده خرابی حافظه اصلی است لذا بهسرعت سرور را پایین آورده تا از رخداد خرابی دادهها جلوگیری کند. در دسترس نبودن یک وبسایت وقتی خطر از دست رفتن اطلاعات وجود دارد، اصلا گزینه قابل بحثی نیست.
امنیت داده
موتور InnoDB طبیعتی تراکنشی دارد و به همین دلیل میتوان نسخههای پشتیبان برخط را سریع و ساده گرفت. این مساله در موتور MyISAM به یک چالش بدل میشود و باید بهطور مداوم از دادههای موجود در پایگاه داده نسخه پشتیبان تهیه کرد که در مقیاس وبسایتهای بزرگ این مساله اصلا قابل بررسی نیست. تنها راهحلی که MyISAM برای پشتیبانگیری خودکار ارائه میدهد، ایجاد یک سرور پایگاه داده دیگر است که اطلاعات را بهصورت مداوم از سرور اصلی بیرون کشیده و در پایگاه آینهای آن قرار میدهد.
از سوی دیگر، InnoDB میتواند عملیات پشتیبانگیری را هنگام انجام تراکنش بهکار بگیرد و پشتیبانگیری اصلی از تمام پایگاه داده را یک بار و همان ابتدای کار انجام دهد.
چرا از MyISAM استفاده کنیم؟
سادگی:
در مقایسه با مزایای InnoDB بهنظر میرسد که MyISAM حرفی برای گفتن نداشته باشد. هر چند باید اشاره داشت این موتور در برخی موارد مزیتهای خود نسبت به InnoDB را نشان میدهد. یکی از این مزایا، سادگی این موتور است و بههمین دلیل، نوشتن نرمافزارهایی که بتوانند با این موتور کار کنند، ساده خواهد بود.بهینگی: بهینه بودن یکی دیگر از ویژگیهای این موتور است. اگر پایگاه داده با محوریت کلیدهای اصلی طراحی و بهصورت مناسبی هم اندیسگذاری شده است، در این صورت میتوان بازدهی MyISAM را نسبت به InnoDB بیشتر دانست. همچنین برای برخی از جداول بزرگ، استفاده از InnoDB بههیچ عنوان بهصرفه نیست و در زمینه جستجو، نسبت به MyISAM بسیار کندتر عمل میکند.
استفاده از منابع
در علم کامپیوتر این موضوع تقریبا بهصورت یک اصل پذیرفته شده است که با بالا رفتن سرعت، مصرف حافظه نیز افزایش مییابد. همانطور که اشاره کردیم، سرعت InnoDB و الگوریتمهای پیچیده و سریع آن، بدون هزینه نیستند و مصرف حافظه بالایی دارند. نهتنها InnoDB حافظه بیشتری نسبت به MyISAM مصرف میکند، بلکه حجم حقیقی دادهها در موتور نخست بیشتر از MyISAM است.
برای سرورهایی که از نظر منابع محدود هستند، MyISAM بهترین گزینه است، هر چند اگر بهدنبال سطوح بالای موازیسازی میگردید، قطعا MyISAM موتور مناسبی نخواهد بود. البته برای سروری که در مقیاس بزرگ با موتور InnoDB کار میکند، باید منابع سیستمی مناسبی تهیه کرد.
محمد مرادزاده