存储引擎字面如何理解?
其实很多名词,把他们拆开的意思组合起来,就可以大致明白组合成的名词是什么意思。就拿存储引擎来说,存储在计算机中的意思是将数据保存到某种介质中,并且保证数据的正常访问。而引擎的是指发动机的核心。
组合起来的意思大致是保存数据的核心技术,也就是说,存储引擎是服务于存储服务的,通过存储引擎将数据保存。就跟计算机如何将数据保存到磁盘中一样,在数据库中,存储引擎的意思就是通过何种引擎将数据存储在磁盘中。
数据库存储引擎
在数据库中,存储引擎是数据库中的底层套件,在创建表中使用,指定通过何种引擎存储数据,MySQL数据库默认使用的存储引擎为InnoDB。
不同的存储引擎有不同的存储机制,并且支持的功能也不相同。对于存储引擎的选择,基本上都是根据需求来定的。
以下为引用,地址:MySQL8.0版本参考手册
MySQL 8.0支持的存储引擎
InnoDB:MySQL 8.0中的默认存储引擎。 InnoDB是用于MySQL的事务安全(兼容ACID)的存储引擎,具有提交,回滚和崩溃恢复功能以保护用户数据。 InnoDB行级锁定(无需升级为更粗粒度的锁定)和Oracle风格的一致非锁定读取可提高多用户并发性和性能。InnoDB将用户数据存储在聚集索引中,以减少基于主键的常见查询的I / O。为了保持数据完整性, InnoDB还支持FOREIGN KEY引用完整性约束。
MyISAM:这些表占用的空间很小。 表级锁定 限制了读/写工作负载中的性能,因此它通常用于Web和数据仓库配置中的只读或只读工作负载中。
Memory:将所有数据存储在RAM中,以便在需要快速查找非关键数据的环境中进行快速访问。该发动机以前称为HEAP发动机。它的用例正在减少;InnoDB借助其缓冲池内存区域,它提供了一种通用且持久的方式来将大多数或所有数据保留在内存中,并 NDBCLUSTER为大型分布式数据集提供了快速的键值查找。
CSV:其表实际上是带有逗号分隔值的文本文件。CSV表允许您以CSV格式导入或转储数据,以便与读取和写入相同格式的脚本和应用程序交换数据。由于CSV表未建立索引,因此通常InnoDB在正常操作期间将数据保留在表中,并且仅在导入或导出阶段使用CSV表。
Archive:这些紧凑的,未索引的表旨在用于存储和检索大量很少参考的历史,归档或安全审核信息。
Blackhole:Blackhole存储引擎接受但不存储数据,类似于Unix /dev/null设备。查询总是返回一个空集。这些表可用于将DML语句发送到从属服务器的复制配置中,但是主服务器不保留其自己的数据副本。
NDB(也称为 NDBCLUSTER):此集群数据库引擎特别适合于需要尽可能高的正常运行时间和可用性的应用程序。
Merge:使MySQL DBA或开发人员可以在逻辑上对一系列相同的MyISAM表进行分组并将它们作为一个对象引用。适用于VLDB环境,例如数据仓库。
Federated:提供了链接单独的MySQL服务器以从许多物理服务器创建一个逻辑数据库的能力。非常适合于分布式或数据集市环境。
Example:此引擎作为MySQL源代码中的示例,说明了如何开始编写新的存储引擎。它主要是开发人员感兴趣的。存储引擎是什么都不做的 “ 存根 ”。您可以使用此引擎创建表,但是不能在其中存储数据或从中检索数据。
若不对存储引擎进行限制,那么在创建表的时候可以指定任意存储引擎。
存储引擎功能表
功能 | MyISAM | Memory | InnoDB | Archive | NDB |
---|---|---|---|---|---|
B树索引 | 是 | 是 | 是 | 否 | 否 |
备份/时间点恢复 | 是 | 是 | 是 | 是 | 是 |
集群数据库支持 | 否 | 否 | 否 | 否 | 是 |
聚集索引 | 否 | 否 | 是 | 否 | 否 |
压缩数据 | 是 | 否 | 是 | 是 | 否 |
资料快取 | 否 | 否 | 是 | 否 | 是 |
加密数据 | 是 | 是 | 是 | 是 | 是 |
外键支持 | 否 | 否 | 是 | 否 | 是 |
全文搜索索引 | 是 | 否 | 是 | 否 | 否 |
地理空间数据类型支持 | 是 | 否 | 是 | 是 | 是 |
地理空间索引支持 | 是 | 否 | 是 | 否 | 否 |
哈希索引 | 否 | 是 | 否 | 否 | 是 |
索引缓存 | 是 | 否 | 是 | 否 | 是 |
锁定粒度 | 表 | 表 | 行 | 行 | 行 |
MVCC | 否 | 否 | 是 | 否 | 否 |
复制支持 | 是 | 限量 | 是 | 是 | 是 |
储存限制 | 256TB | 内存 | 64TB | 否 | 384EB |
T树索引 | 否 | 否 | 否 | 否 | 是 |
交易次数 | 否 | 否 | 是 | 否 | 是 |
更新数据字典的统计信息 | 是 | 是 | 是 | 是 | 是 |
设置存储引擎
在创建表时,通过ENGINE在CREATE TABLE语句中添加表时来指定要使用的存储引擎。
mysql> create table test(id int)engine=myisam;
mysql> show create table test\G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
若是省略ENGINE选项,将使用默认存储引擎。
mysql> create table test2(id int);
mysql> show create table test2\G
*************************** 1. row ***************************
Table: test2
Create Table: CREATE TABLE `test2` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
方式1
通过default-storage-engine可以在my.cnf配置文件中指定默认存储引擎。
例如:将默认存储引擎设为myisam
[root@linux ~]# echo "default-storage-engine=myisam" >> /etc/my.cnf
接下来在MySQL中创建表,不指定存储引擎,默认将是myisam。
mysql> create table test4(id int);
mysql> show create table test4\G
*************************** 1. row ***************************
Table: test4
Create Table: CREATE TABLE `test4` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
方式2
在数据库中,也可使用SET default_storage_engine=存储引擎将默认存储引擎更改,但此方式为临时更改,重新进入数据库中需要重新指定默认的存储引擎。
例如:将默认存储引擎改为InnoDB。
在之前修改my.cnf文件中,已经将默认的存储引擎改为myisam。
mysql> show create table test6;
mysql> show create table test6\G
*************************** 1. row ***************************
Table: test6
Create Table: CREATE TABLE `test6` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
接下来在数据库中修改默认存储引擎。
mysql> set default_storage_engine=innodb;
mysql> create table test7(id int);
mysql> show create table test7\G
*************************** 1. row ***************************
Table: test7
Create Table: CREATE TABLE `test7` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8