一、什么是存储引擎:
存储引擎是MYSQL中特有的一个术语(部分新型国产数据库采用了MYSQL样式开发而成的,也具备该概念);其他的大部分数据库没有这个概念以及术语,Oracle中有类似的概念,不称为存储引擎。
存储引擎实际上是一个表存储、组织数据的方式,而不同的存储引擎,表存储数据的方式会有所不同,基于此,会衍生出一些表操作时的问题,所以可能需要了解一下。但是不建议深入挖掘,除非你就是这个方向的。
二、如何给表添加/指定存储引擎?
1、可以在建立表的时候指定存储引擎:
CREATA TABLE ‘t_student’(
‘no’ int(11) NOT NULL AUTO_INCREMENT,
‘name’ varchar(255) DEFAULT NULL,
‘cno’ int(11) DEFAULT NULL,
PRIMERY KEY(‘no’),
KEY ‘cno’(‘cno’),
CONSTRAINT ‘t_student_ibfk_1’ FOREIGN KEY (‘cno’) REFERENCES ‘t_class’ (‘classno’)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
这段是建表语句,大家看最后一行,在建表语句的右边小括号后面,通过:
ENGINE来指定存储引擎。
就类似后面可以指定默认字符编码(DEFUALT CHARSET=utf8),默认使用utf8编码一样。
Mysql默认的存储引擎是InnoDB;
Mysql默认的字符编码是utf8。
2、数据库表文件查看:
一般情况下mysql数据库所建立的库表都会在C盘这个目录下,同时大家也可以看看其他的表格式,发现基本都是ibd,这说明其实默认的存储引擎(MYSQL中)就是InnoDB。
3、如何查看MYSQL支持哪些存储引擎:
可以直接打开命令窗口登录进去,进入mysql命令行:
show ENGINES \G;
可以看到,在结果中存在9个引擎列表,这代表着MYSQL数据库支持9个引擎;有部分(support)写着的是no,不可用,这不是不支持的意思,而是与数据库的版本有关,并且可以看到一个DEFAULT 的support,代表这是默认的引擎,也就是InnoDB。
三、MySQL常用的存储引擎:
1、MyISAM存储引擎:不支持事务
它管理的表具有以下特征:
使用三个文件表示每个表:
格式文件 – 存储表结构的定义(mytable.frm);
数据文件 – 存储表行的内容(mytable.MYD);
索引文件 – 存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围,提高查询效率。
可以被转换为压缩、只读表来节省空间。这是这种存储引擎的优势!
提示:对于一张表来说,只要是主键,或加有unique约束的字段上都会自动创建索引。
我们新建一个MyISAM引擎的表,并且去磁盘中查找其目录文件:
CREATE TABLE t_myisam(
-> id int PRIMARY KEY AUTO_INCREMENT,
-> name varchar(20)
-> )ENGINE=MyISAM DEFAULT CHARSET=gbk;
等等,我们发现,虽然确实是3个文件,但是为什么有一个后缀不一样?在课件中看到的frm文件没有,变成了.sdi?
这是因为MYSQL版本问题,在MySQL8以后,删除了旧版本的frm文件,并采用了Serialized Dictionary Information(SDI序列化字典信息),是MySQL8.0重新设计数据词典后引入的新产物,并开始已经统一使用InnoDB存储引擎来存储表的元数据信息。在InnoDB 中,SDI信息源记录保存在ibd文件中。
2、InnoDB存储引擎:支持事务
·这是MySQL默认的存储引擎,同时也是一个重量级的存储引擎。
·InnoDB支持事务,支持数据库崩溃后自动恢复机制。
·InnoDB存储引擎最主要的特点是:非常安全!
它管理的表具有下列主要特点:
- 每个InnoDB表在数据库目录中以.frm格式文件表示(在8.0后的文件格式为.sdi);
- InnoDB表空间tablespace被用于存储表的内容(表空间是一个逻辑名称。表空间存储在.ibd文件中)
- 提供一组用来记录事务性活动的日志文件
- 用COMMIT(提交)、SAVEPOINT及ROLLBACK(回滚)支持事务处理。
- 提供全ACID兼容
- 在MySQL服务器崩溃后提供自动恢复
- 多版本(MVCC)和行级锁定
- 支持外键引用的完整性,包括级联删除和更新。
我们简单理解总结:
InnoDB最大的特点是支持事务,事务特性能最大程度保证数据安全,但效率并不高,并且不能压缩,不能转为只读文件,即不会节省存储空间。
由于InnoDB是默认引擎,这边不做示例。
3、MEMORY存储引擎:存储于内存
·使用memory存储引擎的表,其数据存储在内存中,且行的长度固定。
这2个特点使得memory存储引擎非常快!
MEMORY存储引擎管理的表具有以下特征:
- 在数据库目录内,每个表均以.frm格式的文件表示(8.0后sdi文件形式)
- 表数据及索引被存储在内存中!(也就是不会写入硬盘)
- 表级锁机制
- 不能包含TEXT或BLOB字段,即文本和文件流。
Memory存储引擎以前叫HEAP引擎(堆引擎)。
优点:显而易见的是查询效率最高!仅仅存放在内存中。
缺点:因为内存堆会随着关机断电而销毁,也就是说,数据在关机后会消失,数据不安全是最大的缺点!
内存和硬盘区别:在操作系统课程学过
内存的交互是受电流速度影响的,电流有多快它的交互就多快!
硬盘则是通过硬盘磁针一针一针交互(转),转速肯定没有电流速度快。
这里不演示,大家有兴趣可以自行建立一个表数据,然后重启查看。