MySQL中MyISAM和InnoDB的区别

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

MySQL中MyISAM和InnoDB的区别

区别MyISAMInnoDB
事务不支持事务支持事务,事务使用begin和commit进行操作,默认每一条语句都封装成事务,自动提交
默认引擎5.5之前5.5之后
外键不支持支持,如果有外键的表,存储引擎改为MyISAM时会失败
磁盘文件有三个文件,分别是.frm、.myd、.myi,frm是表结构文件,myd是数据文件,myi是索引文件有两个文件,分别是.frm、.ibd,.frm是表结构文件,.ibd是数据文件
索引非聚集索引,支持全文索引聚集索引,不支持全文索引,5.6之后的版本支持全文索引
默认采用的是表锁,不支持行锁,一个更新语句会锁住整张表,读之间并不阻塞,读写阻塞,并发性能低读写阻塞与数据库隔离级别有关,默认采用的是行锁,锁粒度更细一点
行数单独保存了整个表的行数没有保存表的行数,使用select count(*) from table会遍历整个表,消耗较大,注意,比较时后面不能加where条件,如果加上where条件,则两个存储引擎处理方式是一样的。
MVCC不支持支持
崩溃后恢复难度较大,恢复比较苦难依赖redo log恢复到崩溃前的状态

如何选择存储引擎

  1. MySQL5.5之后的版本默认的存储引擎已经是InnoDB,如果不是特殊需求,或者不知道选择哪个时,就用默认。
  2. 是否需要支持事务操作,如果需要,建议采用InnoDB。
  3. 系统是否有读写一起的频繁操作,如果有,建议InnoDB,MyISAM会锁住整张表,读写会阻塞。

索引的实现

MyISAM和InnoDB都是采用的B+树作为索引的数据结构,但是两者之间又有区别,MyISAM中索引文件和数据文件是相互分离的,存储的是实际数据的地址值,也就是上面我们讲的非聚集索引,InnoDB中数据文件本身就是索引文件,存储的是实际的数据,也就是上面讲的聚集索引。