innodb 存储引擎
innodb 存储引擎支持行级锁,外键,事务面对的主要应用是 OLTP(联机事务处理)。并且默认读取操作不会产生锁。从 mysql5.5.8 版本开始就是 mysql 默认的存储引擎。
innodb 存储引擎就是将表数据放在一个表空间文件中,这个表空间文件在 linux 系统的表现方式就是 ibd 文件。这里有个参数 “innodb_file_per_table” 当这个参数开启时每张表都会存放在一个独立的 ibd 文件中。而 ibd 文件中会存放表结构、数据和表对应的索引信息。对表中的数据 innodb 则采用了一种聚集的方式存放,如果建表时指定了主键同时建立了主键索引那这个索引就是聚集索引。没有指定主键数据库会把第一个唯一索引指定为聚集索引,既没有主键索引也没有唯一索引,数据库就会生成一个隐藏的 rowid 作为主键。具体的细节等写到索引再详细说。
通过”多版本并发控制 (mvcc)” 来实现高并发,值得一提的是这并不是 Mysql 独有的笔者接触到的 postgresql 也是用的 mvcc,但是细节上略有不同这个等写到时可以比较一下。Mysql 的 mvcc 也是支持四种隔离级别“读未提交(READ-UNCOMMITTED)”,“读已提交(READ-COMMITTED)”,“不可重复读(REPEATABLE-READ)”,“序列化(SERIALIZABLE)”,默认是第三种。还支持预读(read ahead)、插人缓冲(insert buffer)、自适应哈希索引(adaptive hash
index)、二次写 (double write) 等功能实现高性能和高可用。
myisam 存储引擎
MyISAM 存储引擎不支持事务、表锁,外键,但是支持全文索引,主要用于一些(联机分析处理)OLAP 的应用。在早期的 mysql 数据库中大概是 5.5 版本之前 MyISAM 存储引擎是默认的存储引擎。MyISAM 存储引擎表由 MYD 和 MYI 组成,MYD 用来存放数据文件,MYI 用来存放索引文件。并且可以使用 myisampack 工具来进一步压缩数据文件,但是压缩后的表是只读的,同时可以通过 myisampack 来解压。在 5.0 版本之前,MyISAM 默认支持的表大小为 4GB, 大于 4GB 的表,要制定 MAX ROWS 和 AVG_ROW LENGTH 属性。从 MySQL5.0 版本开始,MyISAM 默认支持 256TB 的单表数据。
Maria 存储引擎
常用的一般就是 innodb 和 MyISAM 两种存储引擎,但是看有些人说是 myisam 的 “改进版本觉得比较有意思还是想介绍一下。特点是:支持缓存数据和索引文件,支持了行锁和 mvcc 功能,指出全文和空间索引。用官网的话说就是“支持更大的索引、更快的索引扫描、更快的插入速度、更快的查询速度等。” 但是这几个“更应该是相较” MyISAM 而言。