پايگاههاي دادهاي از بخشهاي
مختلفي تشکيل شدهاند. يکي از اين بخشها، موتور ذخيره و بازيابي آنهاست
که براي ايجاد، بهروزرساني، حذف و مشاهده اطلاعات (CRUD) در جداول
پايگاههاي داده بهکار ميرود. در پايگاه داده منبعباز محبوب MySQL دو
موتور ذخيرهسازي مختلف بهنامهاي MyISAM و InnoDB وجود دارد. اين دو
موتور ذخيرهسازي تفاوتهاي زيادي با يکديگر دارند که در اين جا قصد داريم
شيوه انتخاب بهترين موتور ذخيرهسازي در شرايط مختلف را بررسي کنيم.
چرا بايد از 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 کار ميکند، بايد منابع سيستمي مناسبي تهيه کرد.
محمد مرادزاده