开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
MySQL中MyISAM和InnoDB的区别
| 区别 | MyISAM | InnoDB |
|---|---|---|
| 事务 | 不支持事务 | 支持事务,事务使用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恢复到崩溃前的状态 |
如何选择存储引擎
- MySQL5.5之后的版本默认的存储引擎已经是InnoDB,如果不是特殊需求,或者不知道选择哪个时,就用默认。
- 是否需要支持事务操作,如果需要,建议采用InnoDB。
- 系统是否有读写一起的频繁操作,如果有,建议InnoDB,MyISAM会锁住整张表,读写会阻塞。
索引的实现
MyISAM和InnoDB都是采用的B+树作为索引的数据结构,但是两者之间又有区别,MyISAM中索引文件和数据文件是相互分离的,存储的是实际数据的地址值,也就是上面我们讲的非聚集索引,InnoDB中数据文件本身就是索引文件,存储的是实际的数据,也就是上面讲的聚集索引。