MySQL(二):MySQL架构与存储引擎

MySQL(二):MySQL架构与存储引擎 目录一、从 SQL 语句谈起二、MySQL 整体架构1. 架构总览三、SQL 分类1. DDL 数据定义语言2. DML 数据操作语言3. DQL 数据查询语言4. DCL 数据控制语言四、存储引擎1. 存储引擎概念2. 查看存储引擎探测全局查看具体某张表五、常见存储引擎1. InnoDB2. MyISAM3. Memory六、存储引擎对比1. InnoDB vs MyISAM2. 为什么默认使用 InnoDB总结一、从 SQL 语句谈起让我们先通过一条典型 SQL 语句的执行过程来梳理 MySQL 的分层架构实现原理SELECT * FROM students WHERE id 1;当你输入这条命令时操作系统和磁盘硬件并不能直接理解这段文本。MySQL 需要逐步解析、校验和转换这条指令最终才能将其转化为磁盘 I/O 操作信号一条 SQL 语句的生命周期这条 SQL 在 MySQL 内部的运作可以被概括为以下五个阶段① 网络发送当你输入 SQL 语句并按下回车键时这条查询文本会被封装成 TCP 数据包通过网络传输至 MySQL 服务器。服务器端的网络处理模块会为其分配一个专用线程并验证你的账户凭证和客户端IP地址的有效性。只有通过身份验证后系统才会允许你建立连接② 语法检查通过验证后SQL 文本被送往解析引擎。词法分析引擎会把这串字符串拆解成一个一个单词。比如它会识别出 SELECT 是一个查询动作students 是目标表名id 是列名语法分析若语法无误解析器便会分解这段文本并在内存中构建出一棵高效的语法树③ 预处理此时预处理器会介入去核实数据库里到底有没有一张叫 students 的表如果有这张表里到底有没有一列叫 id 的字段当前登录的用户有没有权限去查看这张表里的数据 如果这一切检查都通过这棵语法树才算是一棵合法的、有现实业务意义的树④ 优化一条 SQL 的查询路径可能成百上千种路径 A全表扫描一条一条去比对 id 是不是等于 1路径 B索引查找直接利用二分查找定位到 id 1 在哪一个 16KB 的数据页上精准读取那一页MySQL 内部有一个优化器组件。它会根据表里的数据总量、索引分布情况进行成本数学计算在成百上千种路径中挑选出一条耗时最短、磁盘 I/O 成本最低的 最优执行计划⑤ 引擎落地执行器并不直接读写磁盘而是通过调用存储引擎层提供的标准数据接口来操作数据存储引擎层负责实际的磁盘读写或内存缓存查询获取二进制行记录后将其传递给执行器。执行器完成过滤和格式化封装最终通过网络将结果传输到客户端并呈现给用户二、MySQL 整体架构MySQL 最核心的架构设计在于它将复杂的网络通信、SQL 的逻辑编译解析与底层的物理文件读写进行了彻底的解耦MySQL 整体采用分层架构从上到下可以划分为四个核心大层连接层、SQL 层、存储引擎层、文件系统层1. 架构总览MySQL 的架构体系主要由以下四个核心层次协同组成连接层作为架构的最外层该层主要负责客户端连接的管理与生命周期维护。其核心功能包括连接处理安全认证线程管理等SQL 层服务层该层是 MySQL 的核心逻辑处理中心一条 SQL 语句在该层会经历完整的编译与优化生命周期主要包含解析器预处理器优化器与执行器存储引擎层该层是 MySQL 架构中高度模块化和插件化的设计体现。负责底层数据的物理存储、提取和更新。MySQL 官方只定义了一套标准的数据读写接口而把具体的存储格式、索引树设计、数据读写控制、锁的粒度甚至事务的支持全部下放并解耦给了不同的引擎去自行实现文件系统层该层属于物理介质层主要由运行 MySQL 的操作系统文件系统及硬件磁盘组成。负责在物理媒介上持久化各类数据。包括数据文件、重做日志、回滚日志、二进制日志以及系统配置文件等。其最终必须调用操作系统的 I/O 接口将数据持久化到磁盘上三、SQL 分类在 MySQL 整体架构中承上启下的SQL 层在接收到连接层传过来的各种文本指令时解析器会根据其表现出的业务意图将 SQL 语句划分为四大类别1. DDL 数据定义语言核心职能专注于结构的治理。它用于定义、修改或销毁数据库中的各种逻辑结构数据库、数据表、视图、索引等影响DDL 语句一旦执行在底层通常直接体现为对物理文件系统目录的创建、删除或者是.ibd文件 Schema 的重构常用关键字CREATE创建、DROP销毁、ALTER修改结构、TRUNCATE清空表并重置自增计数器经典案例-- 创建业务表定义结构 CREATE TABLE users (id INT, username VARCHAR(20)); -- 在已有表中追加一个年龄字段变更结构 ALTER TABLE users ADD COLUMN age INT; -- 将整张表抹除销毁结构 DROP TABLE users;在绝大多数关系型数据库中DDL 语句是隐式自动提交的无法被回滚。一旦执行 DROP磁盘上的物理数据会瞬间消失2. DML 数据操作语言核心职能专注于 内容的增删改。在表搭建好后DML 用于对表内部的具体行记录进行写操作影响DML 不会改变表的列数和数据类型它在底层只影响 16KB 数据页内部的行数据排布负责插入新行、修改单元格内容、或者给行打上删除标记常用关键字INSERT增加、UPDATE修改、DELETE删除经典案例-- 向表中插入一条新纪录增 INSERT INTO users VALUES (1, 张三, 20); -- 修改特定用户的年龄改 UPDATE users SET age 21 WHERE id 1; -- 清除特定的用户记录删 DELETE FROM users WHERE id 1;DML 是业务高频触发的主流。在 InnoDB 引擎中DML 产生的每一次数据变更都可以被撤销回滚且变更会被记录到 Redo Log 中3. DQL 数据查询语言核心职能专注于 数据的检索与获取。它是整个后端开发中高频使用的、也是优化器介入最深的 SQL 类型影响通常情况下DQL 属于只读操作不会对磁盘文件产生写入污染。它的主要开销是把磁盘上的数据页批量加载到内存中由 CPU 执行过滤、排序、聚合计算后封装回传常用关键字SELECT配合 WHERE、ORDER BY、GROUP BY、LIMIT、JOIN 等经典案例-- 最基础的全表只读检索 SELECT * FROM users; -- 带有条件、排序与分页的复杂高频查询 SELECT id, username FROM users WHERE age 18 ORDER BY age DESC LIMIT 10;4. DCL 数据控制语言核心职能专注于边界控制。它用于管理数据库用户的访问权限和安全级别组件联动DCL 语句直接作用于连接层及系统内部自身的权限库决定了哪个 IP、哪个账号能够连接服务器或者能够对哪些表执行上述的 DDL/DML/DQL常用关键字GRANT赋权、REVOKE回收权限经典案例-- 将 school_db 库下所有表的只读特权赋予给只读账号 readonly_user GRANT SELECT ON school_db.* TO readonly_userlocalhost; -- 收回该账号对该库的查询特权 REVOKE SELECT ON school_db.* FROM readonly_userlocalhost;四、存储引擎在明确区分了SQL语句的四种类型DDL/DML/DQL/DCL后执行器会将优化完成的执行计划传递给下游。至此我们正式进入 MySQL 最核心的存储引擎层1. 存储引擎概念在传统的数据库设计中数据的逻辑解析和物理存储通常是死死捆绑在一起的。而 MySQL 在软件工程上做出了创新引入了 可插拔 的存储引擎架构① 内核定义存储引擎是 MySQL 数据库底层专门负责对数据进行读取、写入、物理构建索引、并发锁控制以及维护事务特性的底层核心软件模块② 核心工程SQL 层只负责理解 SQL 文本、优化路径它对底层数据在磁盘上究竟是以二进制、B 树、还是以加密压缩文件的形式存放一无所知SQL 层与存储引擎层之间仅通过一套官方定义的标准 API 接口进行通信按表插拔精妙之处在于存储引擎的配置是基于表级别的。这意味着在同一个数据库实例中你可以让处理资金的 orders 表使用支持强事务的 InnoDB 引擎而让存放临时日志的 logs 表使用追求高性能的 Memory 内存引擎。这种灵活的引擎配置方案能够根据实际业务需求随时调整充分展现了 MySQL可插拔存储引擎的架构优势2. 查看存储引擎MySQL 提供了两套高频的管理控制命令分别用来探测 全局支持状态 和 单表物理配置探测全局登录 MySQL 命令行客户端后输入以下命令可以查看当前服务器支持的所有存储引擎SHOW ENGINES;Support DEFAULT代表InnoDB是当前 MySQL 8.0 版本的默认引擎。任何建表语句如果不显式指定引擎都会自动由其接管Transactions YES / NO决定该引擎是否具备支持强事务的能力。可以看到只有 InnoDB 亮起了 YES 的绿灯而其他引擎均为 NORow-level locking隐藏信息代表锁的粒度。优秀的引擎支持行级锁只锁住被修改的那一行而较老的引擎只支持表级锁改一条数据就要把整张表全部死锁高并发下表现极差查看具体某张表如果想要知道某张前人创建的表究竟配置了什么引擎可以使用以下两种标准的 DDL 命令1. 查看建表时的信息SHOW CREATE TABLE students;命令服务器将创建该表时的完整 SQL 骨架以及服务端自动补全的物理参数打印出来在输出结果的末尾可以看到 ENGINEInnoDB这表明 students 表当前使用的是 InnoDB 存储引擎查看当前库所有表的状态SHOW TABLE STATUS LIKE students;该命令将以结构化表格形式输出表的统计元数据。结果显示中第一列 Engine 明确标注为 InnoDB同时还会展示 Row_format行存储格式、Rows估算行数、Avg_row_length平均行长度等核心存储指标这些信息是数据库性能优化的关键依据五、常见存储引擎MySQL 发展历程中涌现过数十种存储引擎但真正成为互联网行业支柱的只有三大主流引擎InnoDB、MyISAM 和 Memory1. InnoDBInnoDB是现代 MySQL 默认且最核心的存储引擎。几乎所有的互联网核心业务表如订单、资产、用户主体都必须由它托管物理存储特征 在磁盘上InnoDB 的表结构和数据被统一合并存放在一个以.ibd为后缀的物理文件中。也就是说它的真实行数据和为了加速查找的索引树是存放在同一个物理文件中核心能力支持事务它是三大引擎中唯一能够完美支持事务的。通过内部极其精妙的 Redo Log重做日志和 Undo Log回滚日志它能绝对保证转账、下单等一连串操作要么全成功要么全失败具备高强度的崩溃恢复能力支持外键约束允许在数据库级别建立表与表之间的强关联完整性控制行级锁当多个网络线程同时操作同一张表时只要它们修改的是不同的数据行比如线程A修改用户1线程B修改用户2InnoDB 仅会锁定对应的单行数据从而实现线程间的互不干扰。这极大提升了并发处理效率也是其高并发吞吐能力的核心机制2. MyISAM在 MySQL 5.5 及更早版本中MyISAM是官方默认的存储引擎。该引擎采用极简轻量的设计理念通过舍弃复杂的事务机制来实现高效运行物理存储特征 MyISAM 采取了 数据与索引物理分离 的存储策略。当你创建一张 MyISAM 表时在磁盘目录下创建两个独立的文件.MYD 文件MyData专门用来存放真实的行记录数据.MYI 文件MyIndex专门用来单独存放加速查询的索引树核心特征与缺陷不支持事务不支持外键由于没有日志回滚和断电保护机制一旦服务器意外拔插电源MyISAM 表极易发生数据物理损坏或对齐错误表级锁这是限制其在高并发场的致命短板。在 MyISAM 中哪怕你只想修改某个数据页里仅占 1 个字节的微小行记录该引擎也会瞬间将整张二维表全部死锁。此时外界其他任何线程针对这张表操作都必须排队等待。这种 一人开工全表瘫痪 的锁限制使其完全无力承载高并发的 Web 业务优势场景虽然高并发性能较差但由于其结构简单、不需要维持复杂的事务上下文它的磁盘占用体积更小。在完全只读、或者几乎只有批量插入的低并发冷数据场景下MyISAM 依然拥有极高的磁盘读取效率3. MemoryMemory 存储引擎采用内存计算技术实现了毫秒级的极速响应物理存储特征在磁盘上Memory 表只存放一个用于记录表结构的物理文件。其内部的所有真实行记录数据在运行期全部被托管在操作系统的物理内存中核心特征与缺陷性能极高得益于数据直接在内存中传输无需经过缓慢的磁盘 I/O 操作其响应速度相比 InnoDB 提升数个数量级。底层索引结构默认采用查找复杂度为 O(1) 的高效哈希索引断电即消失由于内存属于易失性介质一旦操作系统的进程退出、或者服务器发生重启断电内存被清空Memory 表里的所有真实业务数据会瞬间蒸发表级锁同样只支持表级锁这限制了它在高并发复杂写场景下的上限业务应用面绝对不能存放任何资产和用户核心数据。它主要在后端充当高频读取的临时查找表、热点数据映射表或在执行复杂聚合计算时作为临时中转使用六、存储引擎对比通过剖析 InnoDB、MyISAM 和 Memory 三大存储引擎架构我们可以明确没有任何一种引擎是完美无缺的它们都是在安全性、性能、并发和存储之间进行工程权衡的结果1. InnoDB vs MyISAM在架构设计和技术选型过程中我们可以通过以下关键指标进行评估InnoDBMyISAMMemory事务支持支持具备 ACID 强一致性不支持不支持锁的粒度行级锁并发踩踏极低表级锁表级锁外键支持支持不支持不支持存储介质物理磁盘.ibd 文件物理磁盘.MYD / .MYI物理内存断电即失崩溃恢复能力极强弱断电极易造成文件损坏无重启后数据完全清空核心适用场景资金、订单、用户权限等高并发读写、对数据安全性要求极高的核心业务海量日志报表分析等几乎完全只读、低并发的场景高频查询的临时中转表、热点映射缓存等允许丢失的临时数据场景2. 为什么默认使用 InnoDB在日常开发中InnoDB 引擎被 99% 的数据表所采用。这种主导地位主要源于以下三个核心优势① 并发吞吐在当今流量激增的互联网环境中高并发已成为系统的基本要求。MyISAM 采用的 表锁 机制会导致整张表被锁定——即使只是修改单条记录也会导致其他成千上万的并发请求被迫阻塞等待。这种机制在每秒吞吐量达数万的电商或社交场景中显然无法满足需求相比之下InnoDB的 行锁 机制实现了真正的并发操作。它仅在多个线程尝试修改同一行数据时才会触发排队等待从而充分发挥了多核 CPU 的并行计算能力② 崩溃恢复能力对企业来说数据就是核心资产。当服务器意外重启时MyISAM 存储引擎经常会出现表文件损坏、索引错位等问题不得不依赖缓慢的人工操作进行修复严重时甚至会导致数据永久性丢失相比之下InnoDB 具备工业级的崩溃安全恢复能力。在写数据前会强制先写保护日志Write-Ahead Logging 机制。即使在写入过程中突然断电数据库重启时也能自动完成恢复通过扫描日志回滚未完成的脏数据并重做已提交的事务操作。这种机制确保了数据库重启后数据的完整性和事务逻辑的严格一致性总结综上所述我们已经从整体视角认识了 MySQL 的内部架构并理解了一条 SQL 语句从客户端发出到最终完成执行的大致过程通过学习连接层、SQL 层、存储引擎层以及文件系统层我们可以发现MySQL 本质上并不仅仅是一个简单的数据存储工具而是一套完整的数据库管理系统。其中SQL 层负责 SQL 语句的解析、优化与执行而真正负责数据存储与管理的则是存储引擎与此同时我们还认识了 MySQL 中常见的几种存储引擎并重点了解了目前生产环境中最主流的 InnoDB 引擎。正是由于 InnoDB 提供了事务、行锁、崩溃恢复等关键能力MySQL 才能够满足现代互联网应用对于数据安全性与并发性能的要求在下一篇中我们将回到数据库的实际使用层面系统学习数据库与数据表的管理操作为后续学习数据查询、表设计以及数据库底层原理打下坚实基础