从InnoDB与MyISAM的区别及支持场景来说明,并给出一些比较明显的特性和注意点。
性能角度:
1.MyISAM类型的表强调的是局限场景下的性能,其单线程只插入或只读取比InnoDB类型更快。主要因为MyISAM使用的表锁的开销小于InnoDB的行锁开销,另外MyISAM实现简单,在读取到索引后直接操作磁盘,本身没有像InnoDB要维护InnoDB bufferpool等代价。同时如果数据比较离散而操作系统磁盘cache中没有数据,MyISAM会遇到大量随机IO,其速度此时未必会比InnoDB快。
2.因为MyISAM只有表锁,而InnoDB支持行锁,使得在混合读写情况下(MyISAM一个线程的写会阻塞另一个线程的读或写),MyISAM会变的比InnoDB慢。
功能角度:
1.事务
MyISAM不像InnoDB那样提供事务支持、外键(外键给MySQL运维及性能带来影响,已被禁止使用)等功能。所以如果要使用MyISAM,你需要确定你的业务不需要且以后也不需要高并发读写及事务支持。
2.全文检索
InnoDB在mysql5.6之后的版本也有全文检索功能了
安全与稳定角度:
InnoDB表损坏概率较低, 由于具备redo日志使得故障恢复能力较好, MyISAM表直采用系统文件存储,完全依赖操作系统物理文件,本身不具备物理恢复能力,特别是在例行的大批量灌数据等操作场景下,易发生损坏。
补充:
MyISAM也有其自身的一些优点,除了上面提到的单线程读或写效率高外,还体现在备份方便(直接拷贝表相关文件)且支持压缩备份(使用mysiampack,数据量为原有数据1/3)。同时,DBA目前有完备的技术来解决InnoDB备份及压缩问题。
在全表count中,如select count(*) from table语句,MyISAM只要简单的读出原就已经保存好的行数目而InnoDB 中不保存表的具体行数,要扫描一遍整个表来计算有多少行。这点在InnoDB表应用中要注意,通常情况下业务采取cache计数等方式来避免统计全表行数。