MySQL中常用的四种存储引擎分别是: MyISAM、InnoDB、MEMORY、ARCHIVE。MySQL 5.5版本后默认的存储引擎为InnoDB。
特性对比
MyISAM | InnoDB | MEMORY | |
---|---|---|---|
是否默认 | 否 | 5.5后默认 | 否 |
索引 | 支持 | 支持 | 支持索引。可以创建普通索引和唯一索引,索引会存储在内存中,以提高查询性能 |
事务支持 | 不支持 | 支持 | 不支持 |
锁 | 支持表锁 | 支持行锁、表锁 | 支持表锁 |
主键 | 可以没有 | 必须有,没有指定会默认生成一个隐藏列作为主键 | 支持 |
外键 | 不支持 | 支持 | 不支持 |
AUTO_INCREMENT | 可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增 | 必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列 | MEMORY 引擎支持自增列。但是,由于表使用内存存储,自增值在重启或崩溃后不会保留,可能会导致在恢复时出现间隙。 |
全文索引 | 支持 | 5.7及以后版本支持 | 不支持 |
并发能力 | 较小 | 较大 | MEMORY 表在并发访问方面的性能较高,因为它们存储在内存中,访问速度快。但需要注意的是,MEMORY 引擎使用的是表级锁,这可能会导致写操作的并发性能受到限制。 |
故障恢复能力 | 可能需要几小时或几天来恢复 | 支持事务处理和故障恢复,回复比较快 | 不支持故障恢复。由于 MEMORY 表的数据存储在内存中,当 MySQL 服务停止或崩溃时,所有数据都会丢失。因此,不适合存储需要持久化的数据。 |
优缺点
1、InnoDB存储引擎
InnoDB是MySQL默认的事务型存储引擎,使用最广泛,基于聚簇索引建立的。InnoDB内部做了很多优化,如能够自动在内存中创建自适应hash索引,以加速读操作。
优点:支持事务和崩溃修复能力;引入了行级锁和外键约束。
缺点:占用的数据空间相对较大。
适用场景:需要事务支持,并且有较高的并发读写频率。
2、MyISAM存储引擎
数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,可以使用MyISAM引擎。MyISAM会将表存储在两个文件中,数据文件.MYD和索引文件.MYI。
优点:访问速度快。
缺点:MyISAM不支持事务和行级锁,不支持崩溃后的安全恢复,也不支持外键。
适用场景:对事务完整性没有要求;表的数据都会只读的。
3、MEMORY存储引擎
MEMORY引擎将数据全部放在内存中,访问速度较快,但是一旦系统崩溃,数据都会丢失。
默认使用哈希索引,将键的哈希值和指向数据行的指针保存在哈希索引中。
优点:访问速度较快。
缺点:
- 哈希索引数据不是按照索引值顺序存储,无法用于排序。
- 不支持部分索引匹配查找,因为哈希索引是使用索引列的全部内容来计算哈希值的。
- 只支持等值比较,不支持范围查询。
- 当出现哈希冲突时,存储引擎需要遍历链表中所有的行指针,逐行进行比较,直到找到符合条件的行。
4、ARCHIVE存储引擎
ARCHIVE存储引擎非常适合存储大量独立的、作为历史记录的数据。ARCHIVE提供了压缩功能,拥有高效的插入速度,但是这种引擎不支持索引,所以查询性能较差。