📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

一、存储引擎层
在MySQL数据库中,存储引擎是数据库核心组成部分之一,它负责数据存储、索引维护、事务处理等。以下将详细介绍存储引擎层的相关知识点,并补充其技术实现细节。
- 核心引擎特性
MySQL支持多种存储引擎,其中InnoDB和MyISAM是最常用的两种。以下是两种引擎的核心特性及其技术实现细节:
(1)InnoDB:支持行级锁定、事务、外键、支持并发读写、支持崩溃恢复。
- 行级锁定:InnoDB使用一种称为“多版本并发控制”(MVCC)的技术,为每行数据创建多个版本,从而实现行级锁定。当事务读取数据时,它只看到数据的某个版本,从而避免了锁的冲突。
- 事务:InnoDB支持ACID事务,确保事务的原子性、一致性、隔离性和持久性。通过undo log和redo log实现事务的回滚和恢复。
- 外键:InnoDB支持外键约束,确保数据的一致性和完整性。
- 并发读写:InnoDB通过行级锁定和MVCC技术,支持高并发读写操作。
- 崩溃恢复:InnoDB使用redo log来记录事务的修改,当数据库崩溃后,可以恢复到崩溃前的状态。
(2)MyISAM:支持表级锁定、不支持事务、不支持外键、读写分离、不支持崩溃恢复。
- 表级锁定:MyISAM使用表级锁定,当事务对表进行写操作时,整个表将被锁定,其他事务无法访问。
- 读写分离:MyISAM支持读写分离,通过将读操作和写操作分离到不同的线程,提高并发性能。
- 崩溃恢复:MyISAM不支持崩溃恢复,当数据库崩溃时,数据可能丢失。
- InnoDB缓冲池机制
InnoDB缓冲池是InnoDB存储引擎的核心数据结构,它负责缓存数据页和索引页。以下是其技术实现细节:
- 缓存数据页:InnoDB缓冲池中存储了从磁盘读取的数据页和索引页。当查询数据时,系统首先检查缓冲池中是否存在所需的数据页,如果存在,则直接从缓冲池中读取数据,从而提高查询效率。
- 缓存淘汰:当缓冲池空间不足时,系统会根据一定策略淘汰部分缓存。常见的淘汰策略包括LRU(最近最少使用)和LRU+(最近最少使用加上随机淘汰)。
- 缓存写入:当修改数据时,InnoDB会先将修改后的数据写入缓冲池,然后根据需要将数据页刷新到磁盘。这个过程称为“写回”,可以减少磁盘I/O操作,提高性能。
- MyISAM索引结构
MyISAM索引采用B+树结构,以下是其技术实现细节:
- 索引节点:每个索引节点包含键值、指向数据行的指针和指向子节点的指针。B+树是一种平衡的多路搜索树,每个节点可以有多个子节点,从而提高查找效率。
- 树结构:B+树是一种平衡的多路搜索树,具有高效的查找、插入和删除性能。B+树的所有叶子节点都包含键值和指针,且叶子节点之间通过指针相连,形成一个有序链表。
- 索引存储:索引数据存储在磁盘上,通过索引节点链接。当查询数据时,系统从根节点开始,逐层向下查找,直到找到所需的键值。
- Memory引擎适用场景
Memory引擎适用于存储临时数据、缓存数据和统计信息等。以下是Memory引擎的技术实现细节:
- 临时数据:Memory引擎适用于存储临时计算结果、缓存数据等。由于数据存储在内存中,访问速度非常快。
- 统计信息:Memory引擎适用于存储统计结果、缓存查询结果等。由于数据存储在内存中,查询效率高。
- 存储架构
MySQL存储架构主要包括以下部分:
- 表空间:存储数据库数据和索引的磁盘区域。表空间可以包含多个文件,每个文件存储一部分数据。
- 文件:表空间中的数据以文件形式存储。MySQL支持多种文件格式,如FPMYI、FRM、MYD等。
- 行格式:存储数据行的方式,包括Compact和Dynamic两种格式。Compact格式占用空间较小,Dynamic格式占用空间较大,但灵活性更高。
- 页分裂机制:当数据页中的数据超过页容量时,系统会进行页分裂操作。页分裂会降低查询效率,因此需要合理设计数据结构和索引。
二、SQL执行体系
SQL执行体系负责解析、优化和执行SQL语句。以下将详细介绍SQL执行体系的相关知识点,并补充其技术实现细节。
- 查询处理
(1)解析器:将SQL语句解析成抽象语法树(AST)。
- 词法分析:将SQL语句分解成单词,如SELECT、FROM、WHERE等。
- 语法分析:将单词序列转换为AST,AST是SQL语句的结构化表示,方便后续优化和执行。
(2)优化器:对AST进行优化,生成执行计划。
- 选择合适的索引:根据查询条件和索引信息,选择最优的索引。
- 排序和分组:确定查询结果的排序和分组方式。
- 连接算法:确定连接操作的顺序和算法。
(3)执行器:根据执行计划执行SQL语句。
- 遍历索引:根据执行计划,遍历索引,查找所需数据。
- 访问数据行:根据执行计划,访问数据行,获取所需数据。
- 解析器工作原理
解析器主要完成以下任务:
- 词法分析:将SQL语句分解成单词,如SELECT、FROM、WHERE等。
- 语法分析:将单词序列转换为AST,AST是SQL语句的结构化表示,方便后续优化和执行。
- 优化器成本模型
优化器根据成本模型选择最优的执行计划。成本模型包括以下因素:
- CPU消耗:执行操作所需的CPU时间。
- I/O消耗:读取或写入数据所需的磁盘I/O次数。
- 连接数:并发执行的连接数。
- 执行计划分析(EXPLAIN)
EXPLAIN语句用于分析执行计划,了解SQL语句的执行过程。以下为EXPLAIN语句的常用选项:
- type:显示连接类型,如ALL、index、range等。
- possible_keys:显示可能使用的索引。
- key:显示实际使用的索引。
- rows:估计的行数。
- 高级语法
(1)窗口函数:用于计算分组内某个值,例如RANK()、DENSE_RANK()等。
- 窗口函数:定义了一个窗口,用于计算窗口内的数据。
- 窗口操作:在窗口内执行计算操作。
(2)CTE(公用表表达式):用于定义一个临时结果集,在查询中多次引用。
- CTE:定义一个临时结果集,可以在查询中多次引用。
- 递归CTE:用于实现递归查询。
(3)递归查询:用于实现递归查询,例如查询树形结构的数据。
- 递归查询:使用递归方式查询数据。
- 递归CTE:使用CTE实现递归查询。
(4)JSON路径表达式:用于处理JSON数据,例如查询JSON对象中的属性。
- JSON路径表达式:定义了一个路径,用于查询JSON对象中的属性。
三、事务机制
事务是数据库操作的基本单位,保证数据的一致性和完整性。以下将详细介绍事务机制的相关知识点,并补充其技术实现细节。
- 隔离级别
隔离级别决定了事务并发执行时的可见性。MySQL支持以下隔离级别:
- READ UNCOMMITTED:最低隔离级别,允许读取未提交的数据。
- READ COMMITTED:允许读取已提交的数据。
- REPEATABLE READ:允许读取一致性数据。
- SERIALIZABLE:最高隔离级别,保证事务串行执行。
- 幻读解决原理
幻读是指在并发事务中,一个事务读取到的数据可能被另一个事务修改,导致读取结果不一致。MySQL通过以下方法解决幻读:
- MVCC(多版本并发控制):为每行数据创建多个版本,事务可以访问不同版本的数据。
- 间隙锁:在读取数据时,对数据所在范围加锁,防止其他事务插入数据。
- MVCC版本链
MVCC版本链是MySQL实现MVCC的关键数据结构,它记录了每行数据的各个版本信息。
- 日志系统
MySQL日志系统主要包括以下部分:
- undo log:记录事务对数据行的修改,用于回滚操作。
- redo log:记录事务对数据行的修改,用于恢复操作。
- binlog:记录数据库的变更,用于备份和恢复。
- 回滚机制
- undo log回滚:使用undo log撤销事务对数据行的修改。
- redo log回滚:在恢复操作中,根据redo log重新执行事务。
- 两阶段提交
两阶段提交是一种分布式事务处理机制,确保事务在所有参与者上的一致性。
- binlog三种格式
MySQL binlog支持以下三种格式:
- Statement:记录SQL语句。
- Row:记录数据行的变化。
- Mixed:结合Statement和Row两种格式。
四、索引体系
索引是提高查询效率的重要手段,以下将详细介绍索引体系的相关知识点,并补充其技术实现细节。
- 索引类型
MySQL支持以下索引类型:
- B-Tree索引:最常见的索引类型,适用于等值和范围查询。
- 全文索引:用于全文检索,如N-gram索引。
- 空间索引:用于地理空间数据,如R-Tree索引。
- 全文索引(N-gram)
全文索引是一种特殊索引,适用于文本数据的检索。N-gram索引是一种基于N-gram的全文索引。
- 空间索引(R-Tree)
空间索引用于地理空间数据的检索,如R-Tree索引。
- 降序索引优化
MySQL支持降序索引,可以提高查询效率。
- 优化策略
- 索引下推:在查询过程中,将索引条件直接应用到数据页,减少访问磁盘的次数。
- 覆盖索引:查询中所需的列都包含在索引中,无需访问数据行。
- 索引合并:合并多个索引,提高查询效率。
五、高可用架构
高可用架构(HA)旨在保证数据库系统的高可用性。以下将详细介绍高可用架构的相关知识点,并补充其技术实现细节。
- 复制技术
MySQL支持以下复制技术:
- 主从复制:主服务器上的数据更改会自动同步到从服务器。
- GTID复制:基于全局唯一标识符(GTID)的复制,提高了复制的可靠性和易用性。
- GTID复制原理
GTID复制通过以下原理实现:
- 主服务器为每行数据生成唯一的GTID。
- 从服务器根据GTID进行数据同步。
- 半同步复制
半同步复制是一种介于同步复制和异步复制之间的复制方式,提高了复制的可靠性。
- 组复制(MGR)
组复制是一种基于Raft算法的分布式复制技术,实现了高可用和故障转移。
- 集群方案
MySQL集群方案主要包括以下几种:
- InnoDB Cluster:基于InnoDB存储引擎的集群方案。
- ProxySQL:用于数据库负载均衡和读写分离的代理服务器。
- Orchestrator:用于自动化数据库故障转移和故障恢复的工具。
六、性能调优
性能调优是提高数据库性能的关键。以下将详细介绍性能调优的相关知识点,并补充其技术实现细节。
- 参数优化
- 连接池配置:合理配置连接池大小,提高并发性能。
- 排序缓冲区:增加排序缓冲区大小,提高排序性能。
- 临时表策略:合理配置临时表存储,提高查询性能。
- 监控工具
- Performance Schema:用于收集数据库性能数据。
- Sys Schema:用于查看数据库系统信息。
- Slow Query分析:分析慢查询,找出性能瓶颈。
总结
本文详细介绍了MySQL存储引擎层、SQL执行体系、事务机制、索引体系、高可用架构和性能调优等方面的知识点,并补充了其技术实现细节。通过学习这些知识点,可以更好地理解MySQL数据库的工作原理,提高数据库性能和稳定性。在实际应用中,需要结合具体场景,灵活运用这些知识点,实现高效、可靠的数据库系统。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~