بهینه سازی MySQL روی لینوکس

اشاره : این یک متن نیمه فنی است درباره بهینه کردن یک سرور MySQL روی لینوکس. مخاطب عمومی ندارد هرچند که خواندن اش بی مزه هم نیست (:

در حین کار رسیدم به جایی که باید روی بانک اطلاعاتی ای با حدود چهار میلیون رکورد حدود صد و شصت هزاربار جستجو و نتایج را ذخیره می کردم. برنامه مورد نظر را نوشتم و کار را شروع کردم. بعد از یکساعت تخمین زمانی اتمام کار حدود ۳۴ روز بود !

برنامه را اصلاح و بهینه کردم و بعد از اجرای دوباره تخمین اتمام کار حدود ۳۱ روز شد !

برنامه را MultiThreatMultiThreatd نوشتم (تقریبا به این معنا که برنامه می تواند به شکل موازی چندین بار اجرا شود) و اجرا کردم ولی زمان اتمام کار همان ۳۱ روز ماند ):

به کامپیوتر نگاه کردم و دیدم چراغ هارد یک نفس روشن است یعنی کل جستجو دارد از روی هارد انجام می شود. Bottle Neck پیدا شد: سرعت هارد. سعی کردم بانک اطلاعاتی چهارصد مگی را روی حافظه ببرم. اینترنت را به دنبال mysql optimization گشتم و در نهایت برای اینکار در فایل /etc/my.cnf دو خط زیر را اضافه کردم:

</pre>
[mysqld]

key_buffer_size=300M
read_buffer_size=300M
</pre >

و سرویس بانک اطلاعاتی را restart‌ کردم و برنامه را اجرا. سرعت بیشتر نشده بود ولی با نگاه کردن به /proc/meminfo می شد دید که بانک اطلاعاتی به حافظه منتقل شده است ولی به دلیل کمبود حافظه کماکان هارد به عنوان swap‌ کار می کند.

در مرحله بعد از مدیرم خواستم حافظه کامپیوترم را به 2GB ارتقاء بدهد. بعد از انجام این کار دوباره برنامه اولیه را اجرا کردم و به چراغ های کامپیوتر نگاه کردم. چراغ هارد برای چند ثانیه روشن بود و بعد کلا خاموش شد (همه بانک اطلاعاتی به رم منتقل شده بود). زمان متوسط اجرا رسید به چهار روز. حالا برنامه بهینه شده سه روز وقت می گرفت و نسخه multithread فقط یک و نیم روز. حالا برنامه در حال اجرا است.