前言
先上个图:
一、MyISAM
1.特点
(1) 既不支持事务 也不支持外键
(2)具有独立的索引文件,所以查询的性能比较高。
(3)采用非聚簇索引,MyISAM的存储文件有三个,后缀名分别是
.frm(存储表结构,每个存储引擎都有),
MYD(数据文件),
MYI(索引文件)
数据文件和索引文件可以防止在不同的目录下,平均分布io,获得更快的速度。
(4)支持全文检索,支持数据压缩(myisampack -b -f testmysam.MYI)
(5)支持表锁,不支持行锁。
2.存储格式
(1)静态表
默认的存储格式,固定长度
优点:存储快,容易缓存,出现故障容易恢复。
缺点:占用的空间比动态表多。
(2)动态表
变长
优点:占用的空间较小;
缺点:频繁的更新和删除记录会产生碎片。
(3)压缩表
由myisampack工具创建,占用非常小的磁盘空间,
因为每个记录都被单独压缩。
3.应用场景
(1)非事务型应用(报表系统、日志系统)
(2)空间类应用(GIS,MyISAM是有空间函数、坐标等)
(3)以select 和 insert为主的应用
二、InnoDB
1.概述
InnoDB提供了提交,回滚,崩溃恢复能力的事务安全保障,同时提供了更小的锁粒度和更强的并发能力,拥有自己独立的缓存和日志。对比存储引擎,innodb会占用更多的磁盘空间存储索引,但是大多数情况下,它是更好的选择。
2.特点
(1)支持行锁
(2)外键约束
只有innodb支持外键,也就是说父表发生改变,子表会根据外键的限制条件,来确定是否发生改变。
外键需要注意的细节很多,一旦使用不当,会对性能造成很大影响。所以需要慎重使用外键。
(3)主键和索引
innodb采用聚簇索引,Innodb的存储文件有两个,后缀名分别是.frm、.ibd(数据文件加索引)。
聚簇索引被成为主索引,并且也是innodb表的主键,innodb表每行数据都保存在主索引的叶子节点上,所有的innodb表必须包含主键,如果创建表时候,没有显示指定主键,那么innodb引擎就会自动创建一个长度为6个字节的long类型隐藏字段指定主键。
(4)存储方式
1.使用共享表空间存储:这种方式创建的表的表结构保存在.frm文件中,数据和索引存在innodb_ data home_ dir 和innodb data file path 定义的表空间中,可以是多个文件。
2.使用多表空间存储:这种方式创建的表的表结构仍然保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。如果是一个分区表,则每个分区对应单独的.ibd文件,文件名是“表名+分区名”,可以在创建分区的时候指定每个分区的数据文件的位置,以此将表的IO均匀分布在多个磁盘上。
**使用共享表空间时,随着数据的不断增长,表空间的管理维护会变得越来越困难,所以一般都建议使用多 表空间。**要使用多表空间的存储方式,需设置参数innodb file per table ,在MySQL 5.7中,此参数默认设置为ON,即新建的表默认都是按照多表空间的方式创建。如果修改此参数为OFF,则新创建的表都会改为共享表空间存储,但已有的多表空间的表仍然保存原来的访问方式。
3.应用场景
(1)需要支持事务的业务(例如转账,付款)
(2)数据读写和更新都比较频繁的场景
三、Memory
(1)具有文件存储引擎的特点,数据是保存在内存中的,也被称为HEAP存储引擎,Mysql重启数据全部丢失。
(2)支持hash索引和B+树索引
(3)所有字段都是固定长度varchar(10) = char(10)
(4)不支持BloB和Text等大字段。
(5)使用的是表级锁。
四、如何选择合适的存储引擎
MyISAM: MySQL 5.5之前版本默认的存储引擎。 如果应用是以读操作和插入操作为主,只有极少的更新和删除操作,并且对事务的完整性没有要求、没有并发写操作,那么选择这个存储引擎是适合的。 OLTP环境一般建议不要再使用MyISAM。
InnoDB: MySQL 5.5之后版本的默认存储引擎,用于事务处理应用程序,支持外键。对于大多数的应用系统,InnoDB都是合适的选择。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性。数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么应该优先选择InoDB存储引擎。InnoDB 存储引擎除了有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚( Rllback ).
MEMORY:将所有数据保存在RAM中,在需要快速定位记录和其他类似数据的环境下,可提供极快的访问速度。MEMORY的缺陷是对表的大小有限制,太大的表无法缓存在内存中,其次是要确保表的数据可以恢复,数据库异常终止后表中的数据是可以恢复的。通常用于更新不太频繁的小表,所以用于快速得到访问结果。