MySQL(7-存储引擎)
基本介绍
数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多的数据库管理系统都支持多种不同的数据引擎。MySQL 的核心就是存储引擎。
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。MySQL5.7 支持的存储引擎有:InnoDB, MyISAM, Memory, Merge, Archive, Federate, CSV, BLACKHOLE 等。
可以使用 SHOW ENGINES 语句查看系统支持的引擎类型
InnoDB 存储引擎
InnoDB 给 MySQL 的表提供了事务、回滚、崩溃修复能力和多版本并发控制的事务安全。MySQL 从 3.23.34a 开始就包含 InnoDB 存储引擎,InnoDB 是 MySQL 第一个提供外键约束的表引擎,而且 InnoDB 对事务处理的能力也是 MySQL 其他存储引擎所无法与之比的。
MySQL5.5.5 之后,InnoDB 作为默认的存储引擎,MySQL 8.0 版本在原先的基础上将系统数据库的存储引擎也改为了 InnoDB。
InnoDB 主要特性有:
- 支持事务
- 灾难恢复性好
- 为处理巨大数据量的最大性能设计
- 实现了缓存管理,不仅能缓存索引也能缓存数据,并且会自动创建散列索引以加快数据的获取
- 支持外键完整性约束。
- 支持行级锁定
- 使用聚簇索引
InnoDB 存储引擎中支持自动增长列 AUTO_INCREMENT。自动增长列的值不能为空,且值必须唯一。MySQL 中规定自增列必须为主键。在插入值时,如果自动增长列不输入值,那么插入的值为自动增长后的值;如果输入的值为 0 或空(NULL),那么插入的值也为自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,那么可以直接插入。
InnoDB 存储引擎中支持外键(FOREIGN KEY)。外键所在的表为子表,外键所依赖的表为父表。父表中被子表外键关联的字段必须为主键。当删除、更新父表的某条信息时,子表也必须有相应的改变。
优缺点:
- 优点:提供了良好的事务管理、崩溃修复能力和并发控制;
- 缺点:其读写效率稍差,占用的数据空间相对比较大。
MyISAM 存储引擎
MyISAM 存储引擎是基于 ISAM 存储引擎发展起来的。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认的存储引擎
MyISAM 主要特性有:
- 不支持事务
- 使用表级锁,并发性差
- 主机宕机后,MyISAM 表易损坏,灾难恢复性不佳
- 可以配合锁,实现操作系统下的复制备份、迁移
- 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的,可能引发过多的系统调用且效率不佳
- 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能
- 可以把数据文件和索引文件放在不同目录
MyISAM 存储引擎的表存储成 3 个文件。文件的名字与表名相同,扩展名包括 frm、MYD 和 MYI。
- frm 为扩展名的文件存储表的结构;
- MYD 为扩展名的文件存储数据,是 MYData 的缩写;
- MYI 为扩展名的文件存储索引,是 MYIndex 的缩写。
基于 MyISAM 存储引擎的表支持 3 种存储格式,包括静态型、动态型和压缩型。其中,静态型为 MyISAM 存储引擎的默认存储格式,其字段是固定长度的;动态型包含变长字段,记录的长度不是固定的;压缩型需要使用 myiampack 工具创建,占用的磁盘空间较小。
优缺点:
-
优点:占用空间小,处理速度快;
-
缺点:不支持事务的完整性和并发性。
MEMORY 存储引擎
MEMORY 存储引擎是 MySQL 中一类特殊存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与 InnoDB 存储引擎、MyISAM 存储引擎不同。
MEMORY 主要特性有:
- 使用表级锁,虽然内存访问快,但如果频繁的读写,表级锁会成为瓶颈
- 只支持固定大小的行。varchar 类型的字段会存储为固定长度的 char 类型,浪费空间
- 不支持 TEXT、BLOB 字段。当有些查询需要使用到临时表(使用的也是 MEMORY 存储引擎)时,如果表中有 TEXT、BLOB 字段,那么会转换为基于磁盘的 MyISAM 表,严重降低性能
- 由于内存资源成本昂贵,一般不建议设置过大的内存表,如果内存表满了,可通过清除数据或调整内存表参数来避免报错
- 服务器重启后数据会丢失,复制维护时需要小心
每个基于 MEMORY 存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为 frm 类型,该文件中只存储表的结构,而其数据文件都是存储在内存中的。这样有利于数据的快速处理,提供整个表的处理效率。值得注意的是,服务器需要有足够的内存来维持 MEMORY 存储引擎的表的使用。如果不需要使用了,可以释放这些内存,甚至可以删除不需要的表。
MEMORY 存储引擎默认使用哈希(HASH)索引,其速度要比使用 B 型树(BTREE)索引快。如果希望使用 B 型树索引,可以在创建索引时选择使用。
MEMORY 表的大小是受到限制的。表的大小主要取决于两个参数,分别是 max_rows 和 max_heap_table_size。其中,max_rows 可以在创建表时指定;max_heap_table_size 的大小默认为 16MB,可以按需要进行扩大。因此,其存在于内存中的特性,这类表的处理速度非常快。但是,其数据易丢失,生命周期短。基于这个缺陷,选择 MEMORY 存储引擎时需要特别小心。
总结
功能 | InnoDB | MyISAM | Memory |
---|---|---|---|
存储限制 | 64TB | 256TB | RAM |
支持事务 | Yes | No | No |
支持全文索引 | No | Yes | No |
支持树索引 | Yes | Yes | Yes |
支持哈希索引 | No | No | Yes |
支持数据缓存 | Yes | No | N/A |
支持外键 | Yes | No | No |