【MySQL学习】MySQL体系结构和存储引擎

这里写自定义目录标题

【背景】

最近小编在复习MySQL,之前对于MySQL的学习大部分是关于如何使用,这次学习的部分是关于背后的一些原理和底层的东西,觉得很有必要总结一下。如有错误,欢迎指正。

【内容】

|--------|

| 一、基本概念 |

数据库 :物理操作系统文件或其他形式文件类型的集合。文件,可以是frm、MYD、MYI、ibd结尾的文件
数据库实例:MySQL数据库由后台线程以及一个共享内存区组成。程序

一般情况下,实例与数据库的关系是一一对应 的,在集群 情况下可能存在一个数据库被多个数据实例使用 的情况。

MySQL是一个单进程多线程架构的数据库。

注:MySQL实例的进程名通常是 mysqld,它在启动时加载数据库文件。

|-------------|

| 二、MySQL体系结构 |

1、连接层

用于处理客户端连接(如连接池)。

2、服务层

用于解析、优化和执行SQL(如SQL接口、查询分析、优化器)。

(1)SQL接口组件

SQL 接口位于 MySQL 服务层的核心位置,是客户端(如应用程序、命令行工具、可视化工具)与 MySQL 服务器进行交互的首要入口点。

  1. 接收客户端请求 :监听并接收来自网络连接或本地连接的客户端发送过来的 SQL 语句(查询、更新、管理命令等)或协议请求。
  2. 分发请求 :将接收到的 SQL 语句或请求传递给服务层内部的其他组件(如查询解析器、查询优化器)进行后续处理。
  3. 返回结果接收并处理 由存储引擎层或其他服务层组件返回的执行结果或状态信息,并将其格式化后发送回客户端。
(2)查询分析组件

主要负责接收客户端提交的SQL语句,并进行初步处理。其核心功能包括:

  1. 语法分析 :通过解析器(Parser)将SQL语句转换为抽象语法树(AST)。例如
sql 复制代码
SELECT * FROM users WHERE age > 25;

会被拆解为:

选择操作符 SELECT

目标表 users

条件表达式 age > 25

  1. 语义检查 :验证语句的合法性
  • 表名、列名是否存在
  • 数据类型匹配性(如 WHERE age > 'abc' 会报错)
  • 权限校验(用户是否有操作权限)
  1. 输出中间表示 :生成查询的内部表示结构(如逻辑查询树),供后续优化器使用。例如
isbl 复制代码
Projection(*)
│
└── Selection(age > 25)
    │
    └── TableScan(users)
(3)优化器组件

MySQL 服务层中一个至关重要的组件。它的核心职责是 为一个给定的 SQL 查询语句找出它认为最高效的执行方案(执行计划) 。当 SQL 语句被解析器解析成内部结构后,优化器就会开始工作。
优化器的工作流程:

  1. 接收解析后的查询树: 解析器将用户提交的 SQL 语句解析成一个内部表示(通常称为查询树或语法树)。
  2. 生成可能的执行计划: 优化器会分析查询树,考虑所有可能的访问表的方式(如全表扫描、使用哪个索引)、连接表的顺序和方法(如嵌套循环连接、哈希连接、排序合并连接)、子查询的处理方式等,生成一系列候选的执行计划。
  3. 基于成本估算 : 优化器会为每个候选的执行计划计算一个 成本(Cost) 。这个成本是 MySQL 内部定义的一个度量单位,用于比较不同计划的开销。成本估算主要基于以下因素:
  • I/O 成本: 读取数据页(磁盘或内存)所需的开销。
  • CPU 成本: 处理数据(如比较、排序、计算表达式)所需的开销。
  • 内存成本: 执行计划可能占用的内存大小。
  • 表统计信息 : 优化器严重依赖表的统计信息来进行估算,包括:
    • 表的行数 (rows)
    • 索引的基数 (cardinality) - 索引列中不同值的数量。
    • 索引和数据页的大小。
    • 数据的分布情况(直方图)。
  1. 选择最优计划 : 优化器会比较所有候选执行计划的估算成本,并选择它认为成本最低的那个作为最终的执行计划。
  2. 输出执行计划 : 选定的执行计划被传递给执行器 (Executor),由执行器负责调用存储引擎层提供的接口来实际执行这个计划,获取结果并返回给客户端。

3、存储引擎层

插件式设计,负责数据存储和检索(如InnoDB)。主要组件包括:

  1. 存储引擎实现

    包括多种可插拔 的引擎(如 InnoDB、MyISAM、Memory 等),每种引擎实现独立的存储机制索引结构

  2. 数据文件与日志

    数据文件(如 .ibd、.myd)存储表数据和索引。

    引擎专属日志(如 InnoDB 的 redo log、undo log)保障事务和恢复。

  3. 缓存机制
    引擎级缓存(如 InnoDB 的 Buffer Pool)管理数据页的内存缓存,减少磁盘 I/O。

4、文件系统层

文件系统层承担了MySQL数据持久化、高效I/O调度和系统可靠性的核心任务,是数据库稳定运行的基石。主要组成:

  1. 数据文件
  • 表结构文件(.frm):存储表定义的元数据(如字段、索引结构)
  • 表数据文件
    • InnoDB引擎:.ibd(独立表空间)或ibdata(共享表空间)
    • MyISAM引擎:.MYD(数据文件)和.MYI(索引文件)
  1. 日志文件
  • 重做日志(ib_logfile0, ib_logfile1):记录事务操作,用于崩溃恢复
  • 二进制日志(binlog.xxxxxx):记录数据变更,用于复制与点恢复
  • 错误日志(hostname.err):记录启动、运行、关闭时的诊断信息
  • 慢查询日志(slow-query.log):记录执行时间过长的SQL语句
  1. 配置文件 (my.cnf/my.ini)
    存储服务器参数配置,如缓存大小、日志路径等。

PS:存储引擎是基于表的 ,而不是数据库。这意味着在同一数据库中,不同表可以使用不同存储引擎(如InnoDB和MyISAM混合使用)。

|-------------|

| 三、MySQL存储引擎 |

存储引擎层是 MySQL 的"数据管家",其设计直接影响数据库的性能、一致性和扩展性。选择合适的引擎(如默认的 InnoDB)可优化事务处理与高并发场景。

存储引擎分类

1、InnoDB存储引擎:

是MySQL的默认存储引擎,支持行锁外键事务 (ACID兼容),采用 B+ 树索引,适合OLTP应用。非锁定读(如MVCC)减少锁争用。

设计目标主要面向在线事务处理(OLTP )的应用。

特点是行锁设计、支持外键,并指示类似于Oracle的非锁定读。

2、其他存储引擎
  • MyISAM :不支持事务,表锁,支持全文索引,适合读密集型应用。
  • Memory数据存储在内存,速度快,适用于临时表,但重启后数据丢失。
  • Archive :高压缩比,适合日志存储
  • 其他如NDB (集群引擎)、Federated(远程表访问)等,使用较少。

补充:InnoDB在MySQL 8.0中是默认引擎,而MyISAM在旧版本常见,但现在不推荐MyISAM用于生产环境,因为它缺乏事务支持

主要职责

1. 数据存储与索引管理

◦ 定义数据的物理存储格式 (行/列存储)。

◦ 实现索引结构 (如 B+ 树、哈希索引),支持高效查询。

◦ 管理数据文件的分配与回收

2. 事务处理

◦ 支持 ACID 特性(通过 redo log、undo log等)。

◦ 实现**多版本并发控制(MVCC)**以处理读写冲突。

3. 并发控制

◦ 提供锁机制 (如行锁、表锁)协调多线程访问。

◦ 例如 InnoDB 的行锁支持高并发写操作。

4. 故障恢复

利用日志(如 redo log)在崩溃后恢复数据一致性。

5. 数据访问接口

向上层(SQL 解析层)提供统一的读写接口,例如:

sql 复制代码
SELECT * FROM table WHERE id = 1;  -- 调用引擎的索引扫描接口
 
相关推荐
你想考研啊2 小时前
win11安装mysql
数据库·mysql
Gary董2 小时前
mysql全面优化从哪几方面入手
数据库·mysql
Humbunklung2 小时前
记一次MySQL数据库备份与SQL格式内容导出导入
数据库·sql·mysql
予枫的编程笔记2 小时前
【MySQL筑基篇】Schema设计避坑指南:INT/BIGINT、CHAR/VARCHAR选型不再纠结
mysql·数据库设计·三范式·反范式·schema设计·数据类型选型·数据库性能优化
我真的是大笨蛋2 小时前
MySQL临时表深度解析
java·数据库·sql·mysql·缓存·性能优化
南屿欣风3 小时前
MySQL Binlog 数据恢复实战
数据库·mysql
Wzx1980123 小时前
go聊天室接入mysql的项目docker部署流程
mysql·docker·golang
梦想的旅途23 小时前
企微全自动化运营的可视化与度量
数据库·mysql
定偶3 小时前
C语言操作MYSQL
c语言·mysql·adb