MySQL-进阶篇-存储引擎

文章目录

  • [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. 完成连接的处理
  3. 认证授权(校验用户名和密码、校验每个用户的权限、用户能够操作哪些数据库、哪些表等)
  4. 检查是否超过最大连接数

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 的特点

  1. DML 操作遵循 ACID 模型,支持事务(DML:Data Manipulation Language,可以理解为数据库中插入、更新、删除和查询数据的 SQL 语句)
  2. 支持行级锁,能够提高并发访问性能
  3. 支持外键(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 的特点

  1. 不支持事务,不支持外键
  2. 支持表锁,不支持行锁
  3. 访问速度快

2.5.2 与 MyISAM 有关的磁盘文件

  1. xxx.sdi(Server-Defined Index)文件:存储表结构信息
  2. xxx.MYD(MY Data)文件:存储表数据
  3. xxx.MYI(MY Index)文件:存储索引信息

xxx.sdi 文件中存储的是一个 JSON 字符串,我们可以直接用 NodePad-- 等软件打开进行查看

将文件内容复制下来后,在 JSON格式化网站 中查看

2.6 Memory 引擎

Memory 引擎的表数据是存储在内存中的,很容易受到硬件问题、或断电问题的影响,所以只能将这些表作为临时表或缓存使用

2.6.1 Memory 引擎的特点

  1. 数据存放在内存中
  2. 默认使用 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 引擎

相关推荐
CQU_JIAKE1 小时前
【miniob】JOIN TABLE DEBUG
数据库·sql·mysql
嚣张农民2 小时前
在 WebSocket 连接中出现错误时,如何处理和捕获错误?
前端·javascript·面试
万少3 小时前
南京x通动力-2024年11月09日
面试
songqq274 小时前
kafka面试夺命30问
分布式·面试·kafka
城南vision5 小时前
一些面试题总结(一)
java·jvm·面试
十一落10 小时前
Sql(MySQL事务四大特性、事务隔离级别)
数据库·sql·mysql
秋秋秋秋秋雨10 小时前
linux强制修改mysql的root账号密码
linux·mysql·adb
Casual_157314 小时前
MySQL 8.0中的‘caching_sha2_password‘身份验证插件问题
数据库·mysql
Charles D15 小时前
【mysql相关】
mysql
Yaml415 小时前
智慧教学资源管理:SpringBoot与Vue的强强联合
java·spring boot·后端·mysql·vue·教学资源