Innodb
1、支持事务,支持ACID。更适用于处理大量的小事务。默认可重复读级别。
2、行锁,支持非锁定锁,即默认读取操作不产生锁。(MVCC版本号机制)用可重复读的非阻塞的方式!
- MVCC(Multi-Version Concurrent Controll多版本并发控制)的技术来实现非阻塞式读,在这个模式下,数据库会为每个数据记录维护多个版本。在可重复读隔离级别下,事务第一次查询记录的时候,会记录一个时间点,在该事务内如果再次查询相同的数据的话,事务只会取上一次查询的记录版本,这样在不需要对数据解锁的情况下就能实现可重复读的隔离级别了。但是在我开来这个是没有意义的,不能避免不可重复度读的并发问题。-----解决方法看其他博客。
3、存储采用了聚集的方式,每张表的存储都是由主键聚集成B+树的方式。
4、使用表空间进行数据存储。
4.1、表空间由innodb_file_per_table参数决定----------ON:独立表空间:会生成一个tablename.idb的文件
OFF:系统表空间:ibdataX,X代表一个数据
4.2、系统表空间和独立表空间应该如何选择:(5.5之前是存储在系统表空间中,5.6之后是独立表空间)
4.2.1、系统表空间无法简单的收缩文件大小。如果想要收缩系统表空间的大小只能:
把所有innodb表导出后,删除innodb相关的表空间后,再重启mysql,进行表空间的重建,然后再导入数据。------复杂而且耗时间,在复杂的系统中无法实现,所以就会造成大量的磁盘空间的浪费(只增不减)和磁盘碎片
4.2.2、独立表空间可以通过optimize table命令收缩系统文件。
就是对一些老数据清理完了之后执行以下optimize table的命令,就能收缩表。其实也是对整个表进行重建,但是它重建的只是自己的表而不是整个系统表,而且不需要重启mysql服务器,而且不影响这个表的正常访问。
4.2.3、系统表空间会产生IO瓶颈
系统表空间当多个请求同时对系统表空间进行刷新时,在文件系统的角度上实际上是顺序执行的。
而独立表空间可以同时向多个文件刷新数据,所以在文件写入的时候可以向多个文件刷新数据,增加IO的性能
MyISAM
1、不支持事务
2、表锁设计
3、支持全文索引
4、相对于Innodb比较简单,所以效率上优于Innodb,小型应用可以使用。当数据有大量的插入、更新操作而查询比较少,就要用Innodb,反之用MyISAM(适用于读多写很少的应用场景,实际开发中很少用到)