MyISAM | InnoDB | MEMORY | NDB | ||
---|---|---|---|---|---|
Multi-statement transactions, ROLLBACK | - | X | - | X | |
Foreign key constraints | - | X | - | - | |
Locking level | table | row | table | row | |
BTREE indexes | X | X | - | X | |
FULLTEXT indexes | X | - | - | - | |
HASH lookups | - | X | X | X | |
Other in-memory tree-based index | - | - | 4.1.0 | - | |
GIS, RTREE indexes | 4.1.0 | - | - | - | |
Unicode | 4.1.0 | 4.1.2 | - | - | |
Merge (union views) | X | - | - | - | |
Compress read-only storage | X | - | - | - | |
Relative disk use | low | high | - | low | |
Relative memory use | low | high | low | high |
อ้างอิงจาก http://dev.mysql.com/tech-resources/articles/storage-engine/part_3.html
จะเห็นว่า InnoDB มีข้อดีเหนือ MyISAM คือ การรองรับ Transaction, Foreign Key, มี Hash Lookup, และการ Lock ได้ถึงระดับ Row
แต่ก็มีข้อเสียคือขาดการทำดัชนีแบบ FULLTEXT, GIS และ RTREE, ไม่มีการ Union Views, ไม่มีการบีบอัด และใช้ทรัพยากรมากกว่า
แต่เหตุใด InnoDB ยังคงเป็นที่นิยม?
- การทำ Transaction ซึ่งไม่มีใน Engine อื่นๆ นอกจาก InnoDB และ NDB เท่านั้น
- ทำสามารถ Lock ได้ระดับ Row ทำเขียนและอ่านได้ในเวลาเดียวกัน
- มีการทำ Hashing ดัชนี
ส่วนสำคัญอีกอย่างคือ InnoDB ได้แยกการทำดัชนี (index) ออกจากตารางข้อมูลและทำ Hashing ดัชนีไว้ด้วยเทคนิคนี้ทำให้การค้นหาเข้าถึงได้รวดเร็ว
จากการทดสอบความเร็วนั้นการ Query ข้อมูลจากตารางน้อยๆ 2-3 ตาราง MyISAM สามารถทำความเร็วได้ดีกว่า แต่เมื่อมีการทำงานกับหลายตาราง >3 ตารางขึ้นไป โดยเฉพาะเมื่อมีข้อมูลหลายล้าน record ขึ้นไปนั้น InnoDB สามารถทำความเร็วได้ดีกว่า เพราะเทคนิคการทำ Hashing ดัชนีแยกไว้นั่นเอง
MyISAM นั้นเนื่องจากไม่มีการ Lock ระดับ Row จึงไม่เหมาะกับงานที่มีการเขียนข้อมูลพร้อมกับการเรียกใช้บ่อยๆ ถ้ามีการเขียนและการอ่านพร้อมๆ กันควรเลือกใช้ InnoDB ดีกว่า ต่อไปเมื่อมีความจำเป็นต้องใช้งาน MySQL ควรเลือก Database Engine ให้เหมาะสมครับ