ใช้ ALTER TABLE ... ENGINE = InnoDB เพื่อแปลง Storage Engine จาก MyISAM เป็น InnoDB
ขั้นตอน
1. สร้างตาราง MyISAM (ตัวอย่าง)
CREATE TABLE MyISAMToInnoDBDemo (
id INT,
Name VARCHAR(100)
) ENGINE = MyISAM;
2. ตรวจสอบ Engine ปัจจุบัน
SELECT TABLE_NAME, ENGINE
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'business' AND ENGINE = 'MyISAM';
-- ผลลัพธ์
+-------------------------+--------+
| TABLE_NAME | ENGINE |
+-------------------------+--------+
| studentrecordwithmyisam | MyISAM |
+-------------------------+--------+
3. แปลงเป็น InnoDB
ALTER TABLE MyISAMToInnoDBDemo ENGINE = InnoDB;
-- Query OK, 0 rows affected (1.65 sec)
4. ตรวจสอบหลังแปลง
SELECT TABLE_NAME, ENGINE
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'test' AND ENGINE = 'InnoDB'
AND TABLE_NAME = 'myisamtoinnodbdemo';
-- ผลลัพธ์
+--------------------+--------+
| TABLE_NAME | ENGINE |
+--------------------+--------+
| myisamtoinnodbdemo | InnoDB |
+--------------------+--------+
วิธีแปลงหลายตารางพร้อมกัน (Script)
-- Generate ALTER Statements
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA IN ('business', 'test')
AND ENGINE = 'MyISAM'
AND TABLE_TYPE = 'BASE TABLE';
⚠️ ข้อควรพิจารณาก่อนแปลง
| หัวข้อ | MyISAM | InnoDB | Impact |
|---|---|---|---|
| Disk Space | น้อยกว่า | มากกว่า 2-3x | ต้องมีพื้นที่พอ |
| COUNT(*) | Instant | Full Scan | Query ช้าลง (ใช้ Counter Table แทน) |
| Full-text Search | Built-in | 5.6+ Supported | OK ใน Version ใหม่ |
| Transactions | ไม่มี | มี (ACID) | App ต้อง Handle Commit/Rollback |
| Foreign Keys | ไม่มี | มี | ต้องเพิ่ม FK Constraints |
| Locking | Table-level | Row-level | Concurrency ดีขึ้น |
| Crash Recovery | Manual REPAIR | Auto | Concurrency ดีขึ้น |
ขั้นตอน Migration แบบปลอดภัย
- Backup Database (
mysqldump) - Test บน Staging Environment
- Check Application Compatibility (Transaction, Lock Behavior)
- Run ALTER TABLE ในช่วง Low Traffic
- Monitor Performance หลัง Migration
- Rebuild Indexes:
ANALYZE TABLE,OPTIMIZE TABLE
MySQL 8.0: Instant DDL
บาง Operation ทำได้แบบ Instant (No Table Rebuild) แต่ ENGINE CHANGE ยังต้อง Rebuild Table เสมอ