一、存储引擎的概念

  • 存储引擎是数据库底层软件组织的核心,它决定了数据库如何存储数据、如何为存储的数据建立索引以及如何更新、查询数据等。

  • 不同的存储引擎提供不同的存储机制、索引技巧、锁级别、事务等功能,以满足不同的应用需求。

  • 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。

  • 存储引擎基于表,而不是基于库,也就说,一个数据库中的多张表可以选择不同的存储引擎,所以存储引擎也可被称为表类型。

  • 如果在建表时没有指定存储引擎,在Mysql中默认的存储引擎就是InnoDB(查询建表语句可以看到)

创建表时指定存储引擎的SQL语句

CREATE TABLE 表名(
  字段......
  ......
)ENGINE = 引擎;

查询当前数据库支持的存储引擎

SHOW ENGINES;

二、InnoDB

  • InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySOL5.5之后,InnoDB是默认的 MySOL 存储引擎,

  • 特点:

    • 事务支持:支持事务处理(ACID兼容),具有提交(COMMIT)和回滚(ROLLBACK)能力。

    • 行级锁定:支持行级锁和外键,锁定粒度小,发生锁冲突的概率最低,并发度也最高。

    • 恢复能力:支持崩溃后的安全恢复。

    • 索引支持:支持B+树索引,全文索引(5.6版本之后)。

    • 表空间:数据和索引存放在表空间里面,支持分区、表空间;InnoDB引擎的每张表都会对应类似以下的表空间文件,存储该表的表结构(frm、sdi)、数据和索引。

xxx.ibd

  • xxx代表的是表名

  • 参数:innodb_file_per_table

  • 查看表空间文件

ibd2sdi /var/lib/mysql/comp/emp.ibd

三、MyISAM

  • MyISAM是Mysql早期的默认存储引擎

  • 特点:

  • 不支持事务:不支持事务处理,也不支持外键。

  • 表级锁定:使用表级锁定,数据更新时会锁定整张表。(不支持行锁)

  • 访问速度快:拥有较高的插入、查询速度,特别是读取操作。

  • 索引支持:支持全文索引,但5.5版本之前不支持外键约束。

  • 文件存储:数据文件(.MYD)、索引文件(.MYI,使用JSON格式存储)分开存储,、存储表结构的文件(.frm)。

四、Memory

  • Memory引擎的表数据时存储在内存中,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。

  • 特点与功能:

    • 内存存储:所有数据都存储在内存中,访问速度极快。

    • 默认索引:默认使用Hash索引,也可以使用B树型索引。

    • 数据持久性:由于数据存储在内存中,重启MySQL服务后数据会丢失。

    • 表结构文件:每个表对应一个磁盘上的.frm文件,用于存储表结构信息。

五、对比

存储引擎

特点

存储限制

事务安全

锁机制

B+tree索引

Hash索引

全文索引

空间使用

内存使用

批量插入速度

支持外键

InnoDB

支持事务处理、行级锁定和外键

64TB

支持

行锁

支持

不支持

支持

支持

MyISAM

不支持事务处理、表级锁定

有(具体限制取决于操作系统和文件系统)

不支持

表锁

支持

支持

支持

逆(视情况而定,取决于数据和索引的组织方式)

半呃(较低,索引和数据在磁盘上)

中等

不支持

Memory

数据存储在内存中,访问速度快,但重启后数据丢失

有(受限于系统内存)

不支持

表锁

支持

不支持

不支持

低(因为数据在内存中)

高(因为数据在内存中)

不支持

六、其他存储引擎

  • Merge:将多个MyISAM表合并为一个逻辑表,查询、更新、删除操作会在内部的MyISAM表上执行。

  • Archive:使用zlib压缩库,提供高压缩比的存储,适合存储大量独立的历史记录数据。

  • CSV:逻辑上由逗号分隔的存储引擎,适用于需要导出为CSV文件或导入CSV文件的应用。

  • Federated:将不同的MySQL服务器联合起来,逻辑上组成一个完整的数据库。

七、选择存储引擎

  • 在选择MySQL的存储引擎时,应根据应用的具体需求来选择。

  • InnoDB:是Mysql的默认存储引擎,支持事务、外键。

    • 如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。

  • MVISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么选择这个存储引擎是非常合适的。

  • MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。

    • MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。