InnoDB เป็น Default Storage Engine ตั้งแต่ MySQL 5.5+ (5.6 เป็น Default จริง) สมดุลระหว่าง Reliability และ Performance
InnoDB - แนะนำสำหรับ Production ส่วนใหญ่
✅ ข้อดี
- ACID Transactions: รองรับ Commit, Rollback, Crash Recovery
- Row-level Locking: Concurrency สูง (Lock แค่ Row ที่ Update)
- Foreign Keys: Enforce Referential Integrity
- Buffer Pool: Cache Data + Index ใน RAM (Performance ดี)
- Auto Recovery: Crash-safe ด้วย Redo/Undo Logs
- Compression: Page Compression, Table Compression
❌ ข้อเสีย
- พื้นที่ Disk มากกว่า MyISAM (~2-3x)
- Complexity สูงกว่า (Tuning Parameters เยอะ)
- Full Table Scan ช้ากว่า MyISAM (ไม่มี Count(*) Optimization)
MyISAM - Legacy Engine
✅ ข้อดี (จำกัด)
- Simple, 輕量
- COUNT(*) เร็วมาก (เก็บ Row Count ใน Metadata)
- Full-text Search (เก่า - MySQL 5.6+ InnoDB ก็มีแล้ว)
- Compress Read-only Tables (myisampack)
❌ ข้อเสียร้ายแรง
- No Transactions: Crash = Data Corruption
- Table-level Locking: WRITE Lock = Block ทุกคน (Read/Write)
- No Foreign Keys: ไม่ Enforce Integrity
- No Crash Recovery: ต้อง REPAIR TABLE
- Deprecated: ไม่ได้รับ Feature ใหม่
ตารางเปรียบเทียบ
| Feature | InnoDB | MyISAM |
|---|---|---|
| Transactions (ACID) | ✅ ใช่ | ❌ ไม่ |
| Row-level Locking | ✅ ใช่ | ❌ Table-level |
| Foreign Keys | ✅ ใช่ | ❌ ไม่ |
| Crash Recovery | ✅ Auto | ❌ Manual REPAIR |
| COUNT(*) Speed | Slow (Scan) | ⚡ Instant |
| Full-text Search | ✅ 5.6+ | ✅ (Legacy) |
| Default Since | 5.5/5.6 | Pre-5.5 |
เมื่อไหร่ควรใช้ MyISAM (น้อยมาก)
- Read-only / Archive Tables (Log, Audit, Historical Data)
- ต้องการ COUNT(*) บ่อยมาก และไม่มี Write
- Legacy App ที่ย้ายไม่ได้ (Migration Cost สูง)
แปลง MyISAM → InnoDB
ALTER TABLE table_name ENGINE = InnoDB;
สรุป
ใช้ InnoDB เป็น Default เสมอ เว้นแต่มีเหตุผลเฉพาะเจาะจงที่ต้องใช้ MyISAM (Read-only Archive) MyISAM ถือว่า Legacy และไม่ควรใช้สำหรับ Application ใหม่