MySQL存储引擎的种类
数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。简而言之,存储引擎是 MySQL 的存储和检索数据表的方法。现在许多数据库管理系统都支持多种不同的存储引擎MySQL的核心就是存储引擎。MySQL 提供了处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等。可以使用SHOW ENGINES;
Support 列的值表示某种引擎是否能使用,YES
表示可以使用,NO
表示不能使用,DEFAULT
表示该引擎为当前默认的存储引擎。
存储引擎 | 描述 |
---|---|
ARCHIVE | 用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。 |
CSV | 在存储数据时,会以逗号作为数据项之间的分隔符。 |
BLACKHOLE | 会丢弃写操作,该操作会返回空内容。 |
FEDERATED | 将数据存储在远程数据库中,用来访问远程表的存储引擎。 |
InnoDB | 具备外键支持功能的事务处理引擎 |
MEMORY | 置于内存的表 |
MERGE | 用来管理由多个 MyISAM 表构成的表集合 |
MyISAM | 主要的非事务处理存储引擎 |
NDB | MySQL 集群专用存储引擎 |
后面会对其中的几种(主要是 InnoDB 和 MyISAM )进行讲解。有几种存储引擎的名字还有同义词,例如,MRG_MyISAM 和 NDBCLUSTER 分别是 MERGE 和 NDB 的同义词。存储引擎 MEMORY 和 InnoDB 在早期分别称为 HEAP 和 Innobase。虽然后面两个名字仍能被识别,但是已经被废弃了。
MySQL查看和修改默认存储引擎
如果需要操作默认存储引擎,首先需要查看默认存储引擎。
#查看默认的存储引擎
mysql> SHOW VARIABLES LIKE 'default_storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set, 1 warning (0.11 sec)
#默认存储引擎修改为 MyISAM
mysql> SET default_storage_engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'default_storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set, 1 warning (0.00 sec)
注意:当再次重启客户端时,默认存储引擎仍然是 InnoDB。
MySQL存储引擎的选择
我们需要根据不同的应用场景去选择合适的存储引擎。
特性 | MyISAM | InnoDB | MEMORY |
---|---|---|---|
存储限制 | 有 | 支持 | 有 |
事务安全 | 不支持 | 支持 | 不支持 |
锁机制 | 表锁 | 行锁 | 表锁 |
B树索引 | 支持 | 支持 | 支持 |
哈希索引 | 不支持 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 | 不支持 |
集群索引 | 不支持 | 支持 | 不支持 |
数据缓存 | 支持 | 支持 | |
索引缓存 | 支持 | 支持 | 支持 |
数据可压缩 | 支持 | 不支持 | 不支持 |
空间使用 | 低 | 高 | N/A |
内存使用 | 低 | 高 | 中等 |
批量插入速度 | 高 | 低 | 高 |
支持外键 | 不支持 | 支持 | 不支持 |
在 MySQL 存储引擎中,事务是指一系列操作,这些操作要么全部成功执行,要么全部失败回滚,保证了数据的一致性和完整性。外键是指一个或多个列,这些列必须与另一个表中的列相匹配,这种匹配关系称为引用完整性约束。使用外键可以将两个表关联起来,避免数据冗余和不一致性,同时还可以保证数据的完整性。
MyISAM
在 MySQL 5.1 版本及之前的版本,MyISAM 是默认的存储引擎。
MyISAM是一种非事务型的存储引擎。它最初是为了提供更快的读写速度而设计的,因此常常被用来存储那些读取频繁,写入不太频繁、数据完整性要求不高的应用数据。与事务型存储引擎不同,MyISAM存储引擎不支持事务处理,也不支持外键和行锁等高级特性。如果出现异常,MyISAM不能回滚整个事务,只能回滚到最后提交点。
虽然MyISAM不能像事务型存储引擎那样保证数据的完整性和可靠性,但是它有一些优点。例如,它支持全文搜索、表级锁定和支持压缩等特性。同时,MyISAM存储引擎的表文件大小比较小,可以提高磁盘空间的利用率,并且能够快速恢复数据,因为它在每个操作之后都会立即写入磁盘而不是借助缓存。
在高并发的情况下,MyISAM存储引擎会出现表锁定的问题,影响读写性能,在面对高并发数据写入的场景下,不适合使用MyISAM存储引擎。因此,对于需要大量的数据查询和读取,同时不需要考虑事务的应用程序,可以考虑使用MyISAM存储引擎。
InnoDB
MySQL 5.5 版本之后默认的事务型引擎修改为 InnoDB。
InnoDB 存储引擎是MySQL的一种事务型存储引擎,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以比 MyISAM 存储引擎占用更多的磁盘空间。是MySQL默认的存储引擎,如果需要使用事务支持和更高的并发性能,建议使用InnoDB存储引擎。但是在一些资源受限的环境中,可以考虑使用MyISAM存储引擎。
如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择。
InnoDB支持行级锁定,这意味着当多个用户同时进行操作时,只会锁定他们所访问的行,而不是整个数据表,从而提高了并发操作的效率。另外,InnoDB存储引擎还支持外键,可以确保数据的参照完整性。
InnoDB存储引擎具有良好的崩溃恢复特性,可以快速地进行数据库恢复。InnoDB还支持自适应哈希索引和自适应读取优化等功能,可以显著提高查询的性能。
MEMORY
MEMORY 存储引擎将所有数据保存在 RAM 中,它可以将数据保存在内存中,而不是保存在硬盘上,所以该存储引擎的数据访问速度快,但是安全上没有保障。
但是由于数据表的数据都保存在内存中,因此如果服务器发生了崩溃或者断电等异常情况,数据就会丢失。另外,MEMORY存储引擎的数据最大空间受限于系统的内存空间,因此无法处理大量的数据。在内存空间紧张的情况下,MEMORY存储引擎也容易引起系统崩溃。此外,由于数据存储在内存中,因此会造成系统内存的大量占用,降低系统的稳定性和可靠性。
MEMORY存储引擎支持表级锁定和哈希索引等特性,并且数据表的所有数据都保存在内存中,不需要像磁盘存储一样进行IO操作,这使得MEMORY存储引擎在处理少量数据的情况下非常快。
MySQL修改数据表的存储引擎
MySQL 中修改数据表的存储引擎的语法格式如下:
ALTER TABLE <表名> ENGINE=<存储引擎名>;
#先查看数据表的存储引擎
show create table student;
#修改存储引擎为 MyISAM 类型
ALTER TABLE student ENGINE=MyISAM;
注意:以上这种方法适用于修改单个表的存储引擎,如果希望修改默认的存储引擎,就需要修改 my.cnf 配置文件。在 my.cnf 配置文件的 [mysqld] 后面加入以下语句:
default-storage-engine=存储引擎名称