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 (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 ดัชนี นอกจากความสามารถสำคัญเรื่องการทำ Transaction ได้แล้วนั้น สิ่งสำคัญที่มีการเลือกใช้ InnoDB คือ การ Lock ระดับ Row แม้ว่า จะมีการใช้ ทรัพยากรที่มากกว่า แต่ด้วยการที่สามารถ Lock ระดับ Row ทำให้สามารถเขียน (Insert/Update/Delete) ในเวลาเดียวกับการอ่าน (Select) ได้ ทำให้เกิดความเร็วไม่ต้องรอการเขียนเสร็จก่อนเช่นใน MyISAM ส่วนสำคัญอีกอย่างคือ InnoDB ได้แยกการทำดัชนี (index) ออกจากตารางข้อมูลและทำ Hashing ดัชนีไว้ด้วยเทคนิคนี้ทำให้การค้นหาเข้าถึงได้ รวดเร็ว จากการทดสอบความเร็วนั้นการ Query ข้อมูลจากตารางน้อยๆ 2-3 ตาราง MyISAM สามารถทำความเร็วได้ดีกว่า แต่เมื่อมีการทำงานกับหลาย ตาราง >3 ตารางขึ้นไป โดยเฉพาะเมื่อมีข้อมูลหลายล้าน record ขึ้นไปนั้น InnoDB สามารถทำความเร็วได้ดีกว่า เพราะเทคนิคการทำ Hashing ดัชนีแยกไว้นั่นเอง MyISAM นั้นเนื่องจากไม่มีการ Lock ระดับ Row จึงไม่เหมาะกับงานที่มีการเขียนข้อมูลพร้อมกับการเรียกใช้บ่อยๆ ถ้ามีการเขียนและการอ่านพร้อมๆ กันควรเลือกใช้ InnoDB ดีกว่า ต่อไปเมื่อมีความจำเป็นต้องใช้งาน MySQL ควรเลือก Database Engine ให้เหมาะสมครับ ขอบพระคุณข้อมูลจาก : Packetlove.com |