وقتی جدول MySQL میسازید، انتخاب Storage Engine مهمه. InnoDB و MyISAM هر کدوم مزایای خودشون رو دارن. تو این مقاله کامل مقایسه میکنم.
Storage Engine چیه؟
روشی که MySQL داده رو در دیسک ذخیره و بازیابی میکنه. MySQL چند Engine داره، مهمترها InnoDB و MyISAM.
InnoDB مزایا
ACID Transaction
تراکنش کامل. اگه یه عمل نصفه بمونه، Rollback میشه.
Foreign Key
روابط بین جداول با Foreign Key.
Row-level Locking
فقط سطر مورد نظر lock میشه، نه کل جدول.
Crash Recovery
اگه سرور crash کنه، خودکار بازیابی میشه.
MVCC
Multi-Version Concurrency Control. کوئریهای همزمان بدون تداخل.
Modern Default
پیشفرض MySQL 5.6+.
InnoDB معایب
- Full-text search کندتر
- حجم فایل بزرگتر
- کوئری Count(*) کندتر
MyISAM مزایا
سرعت Read
برای سایتهای Read-Heavy سریعتر.
Full-text Search
در گذشته فقط MyISAM داشت.
حجم کمتر
فایلهای داده کمحجمتر.
Count(*) سریع
تعداد سطر رو ذخیره میکنه، کوئری سریع.
MyISAM معایب
- Transaction ندارد
- Foreign Key ندارد
- Table-level Locking (کل جدول lock)
- Crash Recovery ضعیف
- تدریجاً کهنه شده
مقایسه با مثال
Bank Application
InnoDB. Transaction ضروری. اگه واریز نصفه بمونه، فاجعه.
Blog که فقط read میشه
InnoDB هم خوبه، MyISAM خیلی کم مزیت.
Log Table (فقط INSERT)
MyISAM سریعتر ولی InnoDB معمولاً کافیه.
e-commerce
InnoDB. سبد خرید، پرداخت نیاز به Transaction دارن.
Migration MyISAM به InnoDB
یک جدول
ALTER TABLE tablename ENGINE=InnoDB;
همه جداول
اسکریپت شل با mysqldump یا SELECT از information_schema.
احتیاط
Backup اول. جدول بزرگ زمان زیادی میگیره.
Performance
SELECT ساده
MyISAM ۵-۱۰٪ سریعتر.
SELECT با JOIN پیچیده
InnoDB برابر یا بهتر.
Write سنگین
InnoDB بهتر. Row-level Locking.
Concurrent Access
InnoDB خیلی بهتر.
حافظه
MyISAM
key_buffer_size برای Index cache.
InnoDB
innodb_buffer_pool_size برای Index + Data cache.
حجم فایل
- MyISAM: .frm + .MYD + .MYI
- InnoDB: .ibd (اگه innodb_file_per_table=1)
Full-text Search
در MySQL 5.6+ InnoDB هم Full-text داره. فرقی نداره.
Backup
MyISAM
ساده. فایلها رو کپی کنید (با LOCK).
InnoDB
xtrabackup یا mysqldump.
Replication
InnoDB بهتر با replication کار میکنه.
Cluster
MySQL Cluster فقط با InnoDB.
Cloud Databases
Amazon RDS، Google Cloud SQL، DigitalOcean فقط InnoDB.
WordPress
پیشفرض InnoDB. حتی برای شروع.
Magento
حتماً InnoDB. Foreign Key ضروریه.
پیشنهاد
۹۹٪ موارد InnoDB انتخاب کنید. MyISAM فقط برای جداول لاگ خاص یا Full-text قدیمی.
بررسی Engine جدول
SHOW TABLE STATUS WHERE Name='tablename';
یا:
SELECT ENGINE FROM information_schema.tables WHERE table_name='tablename';
پیدا کردن MyISAM ها
SELECT table_name FROM information_schema.tables WHERE ENGINE='MyISAM' AND table_schema='yourdb';
MariaDB Aria
MariaDB یه Engine جدید Aria داره که مثل MyISAM ولی Crash-safe.
پیشنهاد سباهاست
همه جداول رو InnoDB نگه دارید. سباهاست InnoDB رو با تنظیمات بهینه ارائه میده.
جمعبندی
InnoDB انتخاب مدرن و درسته. MyISAM دیگه توصیه نمیشه. اگه جدول MyISAM دارید، به InnoDB migration بدید.