وقتی جدول 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 بدید.