存储引擎 | 说明 |
---|---|
MyISAM | 高速引擎,拥有较高的插入,查询速度,但不支持事务 |
InnoDB | 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 |
ISAM | MyISAM的前身,MySQL5.0以后不再默认安装 |
MRG_MyISAM | 将多个表联合成一个表使用,在超大规模数据存储时很有用 |
Memory | 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。只在内存上保存数据,意味着数据可能会丢失 |
Archive | 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作 |
CSV | CSV 存储引擎是基于 CSV 格式文件存储数据(应用于跨平台的数据交换) |
怎么选择存储引擎?:
除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该选择InnoDB引擎。(大部分情况下都选择InnoDB。)
比较项 | InnonDB | MyISAM |
---|---|---|
存储文件 | .frm是表定义文件 .ibd是数据文件和索引文件 | .frm是表定义文件 .myd数据文件 .myi是索引文件 |
锁 | 支持表锁、行锁 | 支持表锁 |
是否支持外键 | 支持外键 | 不支持外键 |
是否支持事务 | 支持 | 不支持 |
CRUD | 读、写 | 读多 |
索引结构 | B+Tree | B+Tree |
show engines;
InnonDB架构图如下:
从图中可见,InnoDB存储引擎由内存结构、磁盘结构两部分组成。
lnnoDB内存结构主要分为如下四个区域:
缓冲池Buaffer Pool用于加速数据的访问和修改,通过将热点数据缓存在内存的方法最大限度地减少磁盘IO,加速热点数据读写。
用于加速非热点数据中二级索引的写入操作。
修改缓冲对二级索引的修改操作会录入redo log中。
在缓冲到一定量或系统较空闲时进行merge操作(写入磁盘) ;
其物理结构为一棵名为ibuf的B+树。
用于实现对于热数据页的一次查询,是建立在索引之上的索引。
作用:对频繁查询的数据页和索引页进一步提速
AHI大小为Buffer Pool的1/64
对于二级索引,若命中 AHI,则将直接从 AHI 获取二级索引页的记录指针,再根据主键沿着聚簇索引查找数据;若聚簇索引查询同样命中 AHI,则直接返回目标数据页的记录指针,此时就可以根据记录指针直接定位数据页。
InnoDB使用Log Buffer 来缓冲日志文件的写入操作。内存写入加上日志文件顺序写的特点,使得InnoDB日志写入性能极高。
这种将分散操作改为批量操作的优化方式将增加数据丢失的风险。
在磁盘中,InnoDB将所有数据都逻辑地存放在一个空间中,称为表空间(Tablespace)。表空间由段(Segment) 、区(extent) 、页(Page)组成。
innodb_file_per_table=1
,每张表的数据都会存储到一个独立表空间,即表名.ibd
文件innodb_file_per_table=0
,则所有基于InnoDB存储引擎的表数据都会记录到系统表空间,即ibdata1
文件表空间是 InnoDB 物理存储中的最高层,目前的表空间类别包括: