文章目录
- [1. MySQL 的体系结构](#1. MySQL 的体系结构)
-
- [1.1 连接层](#1.1 连接层)
- [1.2 服务层](#1.2 服务层)
- [1.3 存储引擎层](#1.3 存储引擎层)
- [1.4 存储层](#1.4 存储层)
- [2. 存储引擎](#2. 存储引擎)
-
- [2.1 存储引擎简介](#2.1 存储引擎简介)
- [2.2 查看数据库支持的引擎](#2.2 查看数据库支持的引擎)
- [2.3 指定存储引擎](#2.3 指定存储引擎)
- [2.4 InnoDB 引擎](#2.4 InnoDB 引擎)
-
- [2.4.1 InnoDB 的特点](#2.4.1 InnoDB 的特点)
- [2.4.2 与 InnoDB 有关的磁盘文件](#2.4.2 与 InnoDB 有关的磁盘文件)
- [2.4.3 InnoDB 的逻辑结构](#2.4.3 InnoDB 的逻辑结构)
- [2.5 MyISAM 引擎](#2.5 MyISAM 引擎)
-
- [2.5.1 MyISAM 的特点](#2.5.1 MyISAM 的特点)
- [2.5.2 与 MyISAM 有关的磁盘文件](#2.5.2 与 MyISAM 有关的磁盘文件)
- [2.6 Memory 引擎](#2.6 Memory 引擎)
-
- [2.6.1 Memory 引擎的特点](#2.6.1 Memory 引擎的特点)
- [2.6.2 与 MyISAM 有关的磁盘文件](#2.6.2 与 MyISAM 有关的磁盘文件)
- [2.7 InnoDB、MyISAM、Memory 三种引擎的区别](#2.7 InnoDB、MyISAM、Memory 三种引擎的区别)
- [2.8 存储引擎的选择](#2.8 存储引擎的选择)
1. MySQL 的体系结构
从上图可以看出,MySQL 服务端的体系结构是分层的
1.1 连接层
连接层主要完成以下操作:
- 接收客户端的连接
- 完成连接的处理
- 认证授权(校验用户名和密码、校验每个用户的权限、用户能够操作哪些数据库、哪些表等)
- 检查是否超过最大连接数
1.2 服务层
大部分核心功能都是在服务层完成的,例如 SQL 接口、查询解析器、查询优化器、查询缓存等
所有跨存储引擎的实现都是在服务层实现的,例如 DML 语句 和 DDL 语句的封装、存储过程、视图触发器等
1.3 存储引擎层
存储引擎主要控制 MySQL 中数据的存储和提取的方式,服务器会通过 API 来与存储引擎进行通信和交换
MySQL 提供了很多存储引擎供我们选择,而且如果这些存储引擎不能够满足我们的需求,我们还可以在其基础上进行扩展
MySQL 的存储引擎是可插拔式的存储引擎,也就是说,如果你要用这个引擎,你就把它加入进来,如果不用,你就把它拔掉
Index,也就是索引,是在存储引擎层实现的,这就意味着不同的存储引擎索引的结构也是不一样的
MySQL 5.5 版本之后,默认采用 InnoDB 引擎
1.4 存储层
存储层的功能主要是将数据存储到文件系统,并完成与存储引擎层的交互
存储层存储的数据包含一系列的日志(Redo Log、Undo Log、错误日志、查询日志、慢查询日志)、数据库数据、索引的二进制信息等,这些数据都会存储在磁盘文件中
2. 存储引擎
2.1 存储引擎简介
到底什么是存储引擎呢,大家第一次听到存储引擎,可能会觉得比较陌生,大家可以先去想一下引擎,引擎就是发动机,发动机是一个机器的核心部分
舰载机有舰载机的引擎、直升飞机有直升飞机的引擎、火箭有火箭的引擎,不同的引擎有不同的引用场景,不同引擎之间并没有好坏之分,我们只需要在合适的场景选择合适的引擎就可以了
存储引擎就是存储数据、建立索引、更新数据、查询数据等技术的实现方式,不同的存储引擎在建立索引、更新数据、查询数据的时候机制是不一样的
存储引擎是基于表的,而不是基于库的,也就是说,同一个数据库下不同的表可以采用不同的存储引擎,所以存储引擎也可被称为表类型
如何查看某一张表使用的是哪种存储引擎呢,可以运行以下 SQL 语句查看
sql
show create table account;
MySQL 5.5 版本之后,默认采用 InnoDB 引擎
2.2 查看数据库支持的引擎
可以执行以下 SQL 语句来查看当前数据库支持的引擎
sql
show engines
我们重点关注 MEMORY、MyISAM、InnoDB 这三种引擎(MySQL 早期的存储引擎是 MyISAM)
2.3 指定存储引擎
可以在创建表的时候指定存储引擎
以下是两个小案例
创建一张名为 my_myisom
的表,并指定使用 MyISAM
存储引擎
sql
create table my_myisam
(
id int,
name varchar(16)
) engine = MyISAM;
创建一张名为 my_memory
的表,并指定使用 MEMORY
存储引擎
sql
create table my_memory
(
id int,
name varchar(16)
) engine = MEMORY;
2.4 InnoDB 引擎
InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 存储引擎
2.4.1 InnoDB 的特点
- DML 操作遵循 ACID 模型,支持事务(DML:Data Manipulation Language,可以理解为数据库中插入、更新、删除和查询数据的 SQL 语句)
- 支持行级锁,能够提高并发访问性能
- 支持外键(FOREIGN KEY)约束,能够保证数据的完整性和正确性
2.4.2 与 InnoDB 有关的磁盘文件
每一个使用了 InnoDB 引擎的表都会有一个后缀名为 ibd(InnoDB Table Data File) 的表空间文件与之对应,这个表空间文件存储了该表的表结构、表数据、索引等信息
我们可以在 MySQL 的数据存储目录下查看 idb 文件(将 blog 更改为具体的数据库)
bat
C:\ProgramData\MySQL\MySQL Server 8.0\Data\blog
idb 文件是不能直接打开的,因为该文件中存储的数据都是二进制的,可以在 idb 文件所在的目录下打开 cmd 窗口,输入以下指令查看 idb 文件中存储的信息
bat
ibd2sdi account.ibd
控制台中输出的信息是一个 JSON 格式的字符串,我们简单分析一下
2.4.3 InnoDB 的逻辑结构
2.5 MyISAM 引擎
MyISAM 是 MySQL 早期的默认存储引擎
2.5.1 MyISAM 的特点
- 不支持事务,不支持外键
- 支持表锁,不支持行锁
- 访问速度快
2.5.2 与 MyISAM 有关的磁盘文件
- xxx.sdi(Server-Defined Index)文件:存储表结构信息
- xxx.MYD(MY Data)文件:存储表数据
- xxx.MYI(MY Index)文件:存储索引信息
xxx.sdi 文件中存储的是一个 JSON 字符串,我们可以直接用 NodePad-- 等软件打开进行查看
将文件内容复制下来后,在 JSON格式化网站 中查看
2.6 Memory 引擎
Memory 引擎的表数据是存储在内存中的,很容易受到硬件问题、或断电问题的影响,所以只能将这些表作为临时表或缓存使用
2.6.1 Memory 引擎的特点
- 数据存放在内存中
- 默认使用 hash 索引
2.6.2 与 MyISAM 有关的磁盘文件
仅有 xxx.sdi 文件存储表结构信息
2.7 InnoDB、MyISAM、Memory 三种引擎的区别
重点关注 InnoDB 引擎与 MyISAM 引擎的区别
2.8 存储引擎的选择
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎,对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合
- InnoDB:是 MySQL 的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择
- MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的(比如与日志相关的数据、电商系统中与浏览足迹和评论相关的数据、与评论相关的数据等,就可以考虑使用 MyISAM,虽然 MyISAM 引擎不支持事务,但是以上类型的数据并不是系统中的核心数据,偶尔丢一两条也没有问题)
- MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存,MEMORY 引擎的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性
实际上,绝大部分的场景都是使用 InnoDB 引擎,MyISAM 引擎和 MEMORY 引擎几乎没有使用,为什么呢
- 因为适合使用 MyISAM 引擎的场景已经有了更好的选择:另一个 NoSQL 类型的数据库------ MongoDB
- 而适合使用 MEMORY 引擎的场景已经有了更好的选择:另一个 NoSQL 类型的数据库------ Redis
如果使用的是 InnoDB 引擎,我们在创建表的时候无需指定存储引擎,因为 MySQL 5.5 版本之后默认使用 InnoDB 引擎