一、InnoDB的特点
InnoDB的优点:
- InnoDB是支持事务的,可以处理大量的短期事务,保证事务的完整提交和回滚
- 支持行锁,在支持表锁的情况下支持行锁,锁粒度更小使得并发度更高
- 支持外键约束
InnoDB的缺点:
- InnoDB在数据写入的效率相对差一些(在插入数据的时候同时在构建B+树,MyISAM则不用)
- 对内存的要求较高:因为索引和数据是同时存放在ibd文件中(索引和数据需要同时加载)
- 在使用count统计行数的时候,需要使用全表遍历,没有设定一个常量来记录表中的总记录数(因为InnoDB是支持事务的,不同的事务在具体操作的时候行数可能是不一致的,所以难以实现)
二、MyISAM的特点
MyISAM的优点:
- 访问速度快,对于select和insert有比较高的响应度
- 针对数据统计有额外的常量存储(在select count(*)的时候直接查询一个该变量即可,InnoDB则需要遍历全表才知道有多少数据)
MyISAM的缺点:
- 不支持事务(崩溃后无法进行数据恢复)
- 不支持外键约束
- 不支持行锁,只支持表锁
三、InnoDB与MyISAM的对比
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
自带系统表使用 | Y | N |
关注点 | 性能:节省资源、消耗少、简单业务 | 事务:并发写、事务、更大资源 |
默认安装 | Y | Y |
默认使用 | N | Y |
四、总结(在InnoDB与MyISAM中,不包括其他的存储引擎)
- 当业务需求中需要保证数据的安全性(支持事务),那么就需要选用InnoDB作为存储引擎
- 在数据的存储量不大,同时主要的业务是select和insert为主的,那么使用的就是MyISAM存储引擎
- 在需要处理大量的数据,同时需要对数据进行频繁的更新以及删除操作的,那么使用InnoDB存储引擎
- 当业务需要满足并发效率高,支持外键等情况下使用InnoDB作为存储引擎
五、扩展
- InnoDB中底层使用的是聚簇索引,也就是索引和数据是一起存放的
- 在MyISAM中底层使用的是二级索引,数据和索引分开存放
- 在MYSQL8.0中InnoDB只有ibd文件用来存放数据,所以和数据是存放在一起的
- 在MYSQL8.0中MyISAM中使用的是myd文件存放数据,myi文件存放索引,两者分开存储
- InnoDB是不支持全文索引的,MYISAM则支持,在MYSQL5.7之后InnoDB页支持全文索引
- 使用InnoDB作为存储引擎一定要有主键(没有则存储引擎会自动的寻找适合的列作为主键或者自动生成一个隐藏字段作为主键),这是因为InnoDB底层是通过B+树进行数据存储的,MyISAM则可以没有主键
- 为什么在频繁的insert和select操作中MyISAM的效率会更高?因为在InnoDB中需要进行事务的处理和MVCC版本控制,但是在MyISAM则不需要,直接进行并发的插入和查询操作