Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MyISAM vs InnoDB: ควรใช้ Storage Engine อันไหนใน MySQL

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 ใหม่

ตารางเปรียบเทียบ

FeatureInnoDBMyISAM
Transactions (ACID)✅ ใช่❌ ไม่
Row-level Locking✅ ใช่❌ Table-level
Foreign Keys✅ ใช่❌ ไม่
Crash Recovery✅ Auto❌ Manual REPAIR
COUNT(*) SpeedSlow (Scan)⚡ Instant
Full-text Search✅ 5.6+✅ (Legacy)
Default Since5.5/5.6Pre-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 ใหม่