
انجینهای دیتابیس مایاسکیوال – MyISAM و Innodb
دیتابیس MySQL از Table Engineهای متفاوتی پشتیبانی میکند که با عنوان “Table Type” هم شناخته میشوند.
یک دیتابیس میتواند مخلوطی از table های مختلف با engineهای متفاوت ویا یکسان باشد. برای مشاهده لیست کاملی از انجینهای موردپشتیبانی دیتابیس MySQL به این صفحه مراجعه کنید.
اما در بین این انجینهای مختلف، در سایتهای طراحی شده بصورت کلاود (cloud) ، از دیتابیس MySQL و دو انجین استفاده میشود: InnoDB و MyISAM.
توجه داشته باشید در این مقاله قصد دارم بصورت کامل مطالب مرتبط با موارد کاربرد این دو انجین در وبسایتهای کلاود را پوشش دهم و کاری با performance نخواهم داشت. اگر نیاز به مطالعه مطالب مرتبط با performance دارید, اینجا و اینجا را مطالعه کنید.
در دیتابیس MySQL 5.0 به بعد ، انجین MyISAM ، بصورت table engine پیشفرض استفاده میگردد اما سایتهای کلاود از انجین InnoDB بصورت پیشفرض در طراحیهایشان استفاده میکنند. به عبارت دیگر وبسایتهای کلاود، اگر شما بصورت کاملا واضح توسط DDL نوع انجین خودتان را مشخص نکرده باشید، از InnoDB در DDL* تیبل شما استفاده میکند. با استفاده از InnoDB ، performance نرمافزارتان نیز بصورت کاملا محسوسی افزایش خواهد یافت.
مقایسه:
MyISAM |
Innodb |
عدم سازگاری با ACID* و دیتا قابل برگشت نیست (به عبارتی non-transactional* است) |
پشتیبانی کامل از ACID و دیتای قابل برگشت . انجین transactional* است.
پشتیبانی کامل از commit و rollback در foreign keyها |
انجین پیشفرض در MySQL 5.0 به بالا |
انجین پیشفرض در بعضی سرورهای هاستینگ کلاود و توزیعهای خاص مانند CloudLinux |
قابلیت فشردهسازی دادهها را دارد |
قابلیت فشردهسازی دادهها را دارد |
هرازگاهی نیاز به repair/rebuild کلیهی indexها و tableها دارد |
با استفاده از فناوری Auto recovery در صورت کراش کردن، توسط لاگها خودش را تعمیر میکند |
تغییرات در دادهها بصورت لحظهای روی دیسک سرور نوشته میشود. |
قبل از commit و flush کردن دادهها روی دیسک سرور، از یک فاصله رندم یا تعیینشده استفاده میکند تا لود سرور بیش از حد بالا نرود. |
هیچ نظمی در هنگام ذخیرهسازی برروی دیتاهای شما اعمال نمیشود |
تمامی ردیفها (rowها) در صفحات مختلف توسط primary keyها مرتب میشوند. |
قفل کردن Table هنگام نوشتن دادهها |
قفل کردن ردیفها (rowها) هنگام نوشتن دادهها |
مفاهیم مقدماتی بانک اطلاعاتی (برای دوستانی که آشنایی ندارند)
* transactional و non-transactional چیست؟
— transactional یعنی سیستم دیتابیس شما از عملیات بازگردانی خودکار rollback و commit پشتیبانی میکند و اگر مشکلی پیش بیاید خودش بصورت اتوماتیک repiar میکند.
— non-transactional از سیستم rollback و commit اتوماتیک پشتیبانی نمیکند،بخاطر همین پرفرمنس برنامه را افزایش میدهد. اما اگر مشکلی پیش بیاید باید خودتان آستین بالا بزنید.
* DDL چیست؟
مخفف Data Definition Language که در واقع شامل عملیات اولیه راهاندازی دیتابیس است . این عملیات عبارتند از CREATE , ALTER , DROP , TRUNCATE , COMMENT و RENAME
* DML چیست؟
Data Manipulation Language که به اختصار DML نامیده میشود ،نامی است که به عملیات دستکاری در دادهها اطلاق میشود. این عملیات عبارتند از: SELECT , INSERT, UPDATE, DELETE, MERGE, CALL, EXPLAIN PLAN و LOCK TABLE
* ACID چیست؟
مخفف یکتایی، قابلیت اطمینان، انزوا و پایداری (Atomicity, Consistency, Isolation, Durability)، خصوصیتی است که در اکثر پایگاه دادهها و در انجام تراکنشها باید پیادهسازی شود.این مشخصه در تراکنشهای بانکها بیشتر مورد توجه قرار میگیرد زیرا یک مجموعه عملیات تراکنش باید به شکل یک عملیات در نظر گرفته شود تا تراکنش با موفقیت صورت گیرد به طور مثال تراکنش انتقال وجه از یک حساب به حساب دیگر،باید دو عملیات به شکل کامل انجام شود. شما میتوانید اطلاعات بیشتری از اینجا کسب کنید
مقایسههای بیشتری نیاز دارید؟ به مستندات MySQL نگاهی بیندازید! مستندات InnoDB و مستندات MyISAM
چه زمانی از MyISAM استفاده کنیم؟
دلایل مختلفی میتواند وجود داشته باشد که شما MyISAM را بعنوان انجین پیشفرض یک table استفاده کنید. اول از همه بخاطر داشته باشید که MyISAM طراحی شد تا متن خام ذخیره کند و برای برنامههایی درنظر گرفته شد که دیتاهایشان به ندرت تغییر میکرد و بیشتر عملیات SELECT روی table انجام میگرفت تا insert ویا update. پس مطمین باشید اگر قرار است دیتای شما به ندرت تغییر کند ولی بسیار خوانده شود، MyISAM سریعترین پیشنهاد موجود برای شماست!
دلیل دیگری که شاید شما بخواهید بخاطرش از خیر InnoDB بگذرید و MyISAM استفاده کنید ، همین پیشتیبانی نکردن از ACID باعث میشود که سیستم دیتابیس شما عملیات کمتری روی دیتابیس شما انجام دهد و این یعنی پرفرمنس بیشتر.
بهرحال بهترین راه برای انتخاب انجین دیتابیس، فقط انجام BENCHMARK توسط شخص خودتان میباشد و باید امتحان کنید تا اندازه خمیر دستتان بیاید!
چه زمانی تغییر انجین از MYISAM به INNODB جزو اوجب واجبات محسوب میشود؟
خوب! جواب همه در جدول بالا قید شده! هروقت که به امکانات InnoDB نیاز داشتید! امکاناتی مثل رولبکهای اتوماتیک و سازگاری با اسید و تعمیرات اتوماتیک!
و یا زمانیکه شما بصورت خیلی سخت همانقدر که عملیات SELECT دارید ، برنامهتان از سایر گزینههای *DML استفاده میکند. مثل INSERT و UPDATE. بهرحال بیاد داشته باشید LOAD سرور شما بالاخواهد رفت پس زیرساخت سختافزاری خود را درنظر بگیرید.
وقتی هم حس کردید کاربرانتان زیاد شده و دیگر TABLE LOCK گزینهی خوبی نیست و بهتر است در سطح بالاتری مراقب race condition باشید، InnoDB پیشنهاد میشود!
چطور TABLE هایم را از MYISAM به INNODB تبدیل کنم؟
به سادگی! با یک خط کد در mysqld یا phpmyadmin:
کد:
ALTER TABLE ENGINE=INNODB; |
چطور یک table با انجین پیشفرض innoDB بسازم؟
کد:
CREATE TABLE mytable (
`pk_id` int(11) NOT NULL,
`name` varchar(128) DEFAULT NULL,
PRIMARY KEY (`pk_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
منبع