这里写自定义目录标题
-
|------------------|
| 一、基本概念</table> ||-----------------------|
| 二、MySQL体系结构</table> ||-----------------------|
| 三、MySQL存储引擎</table> |
【背景】
最近小编在复习MySQL,之前对于MySQL的学习大部分是关于如何使用,这次学习的部分是关于背后的一些原理和底层的东西,觉得很有必要总结一下。如有错误,欢迎指正。
【内容】
|--------|
| 一、基本概念 |
数据库 :物理操作系统文件或其他形式文件类型的集合。文件,可以是frm、MYD、MYI、ibd结尾的文件
数据库实例:MySQL数据库由后台线程以及一个共享内存区组成。程序
一般情况下,实例与数据库的关系是一一对应 的,在集群 情况下可能存在一个数据库被多个数据实例使用 的情况。
MySQL是一个单进程多线程架构的数据库。
注:MySQL实例的进程名通常是 mysqld,它在启动时加载数据库文件。
|-------------|
| 二、MySQL体系结构 |
1、连接层
用于处理客户端连接(如连接池)。
2、服务层
用于解析、优化和执行SQL(如SQL接口、查询分析、优化器)。
(1)SQL接口组件
SQL 接口位于 MySQL 服务层的核心位置,是客户端(如应用程序、命令行工具、可视化工具)与 MySQL 服务器进行交互的首要入口点。
- 接收客户端请求 :监听并接收来自网络连接或本地连接的客户端发送过来的 SQL 语句(查询、更新、管理命令等)或协议请求。
- 分发请求 :将接收到的 SQL 语句或请求传递给服务层内部的其他组件(如查询解析器、查询优化器)进行后续处理。
- 返回结果 :接收并处理 由存储引擎层或其他服务层组件返回的执行结果或状态信息,并将其格式化后发送回客户端。
(2)查询分析组件
主要负责接收客户端提交的SQL语句,并进行初步处理。其核心功能包括:
- 语法分析 :通过解析器(Parser)将SQL语句转换为抽象语法树(AST)。例如
sql
SELECT * FROM users WHERE age > 25;
会被拆解为:
选择操作符 SELECT
目标表 users
条件表达式 age > 25
- 语义检查 :验证语句的合法性。
- 表名、列名是否存在
- 数据类型匹配性(如 WHERE age > 'abc' 会报错)
- 权限校验(用户是否有操作权限)
- 输出中间表示 :生成查询的内部表示结构(如逻辑查询树),供后续优化器使用。例如
isbl
Projection(*)
│
└── Selection(age > 25)
│
└── TableScan(users)
(3)优化器组件
MySQL 服务层中一个至关重要的组件。它的核心职责是 为一个给定的 SQL 查询语句找出它认为最高效的执行方案(执行计划) 。当 SQL 语句被解析器解析成内部结构后,优化器就会开始工作。
优化器的工作流程:
- 接收解析后的查询树: 解析器将用户提交的 SQL 语句解析成一个内部表示(通常称为查询树或语法树)。
- 生成可能的执行计划: 优化器会分析查询树,考虑所有可能的访问表的方式(如全表扫描、使用哪个索引)、连接表的顺序和方法(如嵌套循环连接、哈希连接、排序合并连接)、子查询的处理方式等,生成一系列候选的执行计划。
- 基于成本估算 : 优化器会为每个候选的执行计划计算一个 成本(Cost) 。这个成本是 MySQL 内部定义的一个度量单位,用于比较不同计划的开销。成本估算主要基于以下因素:
- I/O 成本: 读取数据页(磁盘或内存)所需的开销。
- CPU 成本: 处理数据(如比较、排序、计算表达式)所需的开销。
- 内存成本: 执行计划可能占用的内存大小。
- 表统计信息 : 优化器严重依赖表的统计信息来进行估算,包括:
- 表的行数 (rows)
- 索引的基数 (cardinality) - 索引列中不同值的数量。
- 索引和数据页的大小。
- 数据的分布情况(直方图)。
- 选择最优计划 : 优化器会比较所有候选执行计划的估算成本,并选择它认为成本最低的那个作为最终的执行计划。
- 输出执行计划 : 选定的执行计划被传递给执行器 (Executor),由执行器负责调用存储引擎层提供的接口来实际执行这个计划,获取结果并返回给客户端。
3、存储引擎层
插件式设计,负责数据存储和检索(如InnoDB)。主要组件包括:
-
存储引擎实现
包括多种可插拔 的引擎(如 InnoDB、MyISAM、Memory 等),每种引擎实现独立的存储机制 和索引结构。
-
数据文件与日志
数据文件(如 .ibd、.myd)存储表数据和索引。
引擎专属日志(如 InnoDB 的 redo log、undo log)保障事务和恢复。
-
缓存机制
引擎级缓存(如 InnoDB 的 Buffer Pool)管理数据页的内存缓存,减少磁盘 I/O。
4、文件系统层
文件系统层承担了MySQL数据持久化、高效I/O调度和系统可靠性的核心任务,是数据库稳定运行的基石。主要组成:
- 数据文件
- 表结构文件(.frm):存储表定义的元数据(如字段、索引结构)
- 表数据文件 :
- InnoDB引擎:.ibd(独立表空间)或ibdata(共享表空间)
- MyISAM引擎:.MYD(数据文件)和.MYI(索引文件)
- 日志文件
- 重做日志(ib_logfile0, ib_logfile1):记录事务操作,用于崩溃恢复
- 二进制日志(binlog.xxxxxx):记录数据变更,用于复制与点恢复
- 错误日志(hostname.err):记录启动、运行、关闭时的诊断信息
- 慢查询日志(slow-query.log):记录执行时间过长的SQL语句
- 配置文件 (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; -- 调用引擎的索引扫描接口