在学习存储引擎之前,我们先要搞明白一件事,存储引擎是用来形容表的,并不是用来形容数据库的,数据库中的表是存储在磁盘里的,不同的数据库存储的位置可能有所不同,但是MySQL一般存储在data目录下
1、MyISAM存储引擎
一张表,如果选择的是使用MyISAM存储引擎,那么它会在磁盘中产生三个文件,分别是后缀名为.frm .MYD .MYI。(其中.frm表示结构 .MYD表示数据 .MYI表示引擎索引)
MyISAM索引文件和数据文件是分离的,我们称之为非聚集索引
假设我们以字段col1作为索引,那么col1这一列存储在MYI文件中,其余存储在MYD文件中。data指向磁盘文件地址,执行查询的时候,它会跨越这两个文件
2、InnoDB存储引擎
如果你选择的是InnoDB存储引擎,那么一张表对应的是两个底层文件,后缀名分别是(.frm .ibd)
由于data里面存储的是表中对应一行的数据,所以我们称之为聚集索引
- InnoDB表必须要有主键,这是由它的底层结构来实现的,mysql设计的表必须有B+树来组织。如果没有设置,mysql会选择某一列唯一的属性,它会生成rowid。
- 推荐使用整型的自增主键,一是保证主键的唯一性,并且自增插入快,方便范围查询。二是方便按照B+树来构建索引时对比,三是存储空间更小
- 如果一张表有多个索引,则会有多个b+树。辅助索引结构叶子节点存储的是主键值。为了保持一致性和节省存储空间
3、其他存储引擎
还有一些其他的存储引擎,mysql也是支持的,只是平时用的比较少,这里简单介绍
3.1 Archive引擎
Archive存储引擎只支持INSERT和SELECT操作,Archive引擎会缓存所有的写并利用zlib对插入的行进行压缩,所以比MyISAM表的磁盘IO更少。但是每次的SELECT查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫描。或者在一些需要更快速的INSERT场合下也可以使用
3.2 Blackhole引擎
3.3 CSV引擎
3.4 Federated引擎
3.5 Memory引擎