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

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

一、存储引擎层
核心引擎特性
在MySQL中,存储引擎是数据库的核心组件,它负责数据存储、索引维护和事务处理。InnoDB和MyISAM是两种主流的存储引擎,它们在内部实现上有着显著的差异。
-
InnoDB:基于多版本并发控制(MVCC)和行级锁定,支持ACID事务,适合处理高并发写入和复杂事务场景。InnoDB使用一种称为“事务日志”的结构来记录事务的变更,确保数据的持久性和一致性。此外,InnoDB还支持外键约束,这使得它成为构建复杂关系型数据库的理想选择。
-
MyISAM:不支持事务,但具有快速读取性能,适合读多写少的场景。MyISAM使用表锁,当读取或写入操作发生时,会锁定整个表,这可能会在高并发情况下导致性能瓶颈。尽管如此,MyISAM的读取性能在数据量较小的情况下仍然非常出色。
InnoDB缓冲池机制
InnoDB缓冲池是InnoDB存储引擎的核心组件之一,它负责缓存数据页和索引页,以减少磁盘I/O操作。缓冲池的大小对于数据库性能至关重要,配置不当可能会导致性能下降。
InnoDB缓冲池的工作原理如下:
- 当数据库需要读取数据或索引时,首先会检查缓冲池中是否已有缓存。
- 如果缓存中存在所需数据或索引,则直接从缓冲池中读取,无需访问磁盘。
- 如果缓存中不存在所需数据或索引,InnoDB会从磁盘读取数据或索引,并将其放入缓冲池。
- 当缓冲池空间不足时,InnoDB会使用LRU(最近最少使用)算法淘汰最久未使用的页。
MyISAM索引结构
MyISAM使用B+树索引来存储数据,这种索引结构具有以下特点:
- 索引文件和表数据文件是分离的,索引文件存储在表的目录中。
- B+树索引具有层级结构,每一层都包含指向下一层的指针和索引键值。
- 在读取数据时,MySQL会从最顶层开始搜索,直到找到所需的数据行。
Memory引擎适用场景
Memory引擎适用于存储临时数据或需要快速访问的表,其数据存储在内存中。Memory引擎具有以下特点:
- 数据存储在内存中,读取速度快。
- 数据在关闭数据库时会被自动清除。
- 不支持事务和持久化。
存储架构
MySQL的存储架构包括表空间、数据文件和日志文件。表空间可以进一步细分为数据文件和索引文件。
- 表空间:表空间是MySQL数据库的逻辑存储单位,它将数据文件和索引文件组织在一起。
- 数据文件:数据文件存储表数据和索引数据。
- 日志文件:日志文件记录数据库的事务变更,包括undo log和redo log。
表空间管理
表空间管理涉及以下操作:
- 创建表空间:使用
CREATE TABLESPACE
语句创建新的表空间。 - 删除表空间:使用
DROP TABLESPACE
语句删除表空间。 - 修改表空间大小:使用
ALTER TABLESPACE
语句修改表空间大小。
行格式(Compact/Dynamic)
InnoDB支持两种行格式,Compact和Dynamic。
- Compact格式:行格式紧凑,节省空间,适合存储大型数据。
- Dynamic格式:行格式动态,可以存储不同大小的数据。
页分裂机制
当数据插入导致页满时,MySQL会进行页分裂,这可能会影响性能。页分裂的过程如下:
- 新数据无法直接插入到满的页中,因此MySQL会创建一个新的页。
- 将部分数据从满的页中复制到新页中。
- 修改索引,使新页包含原始页的部分数据。
二、SQL执行体系
查询处理
SQL查询处理包括以下步骤:
- 解析:解析器将SQL语句分解为词法单元和语法结构。
- 优化:优化器通过成本模型选择最有效的查询执行计划。
- 执行:执行器根据优化器生成的执行计划执行查询。
- 返回结果:将查询结果返回给客户端。
解析器工作原理
解析器的工作原理如下:
- 将SQL语句分割成词法单元,例如关键字、标识符、数字等。
- 将词法单元组合成语法结构,例如SELECT语句、FROM子句、WHERE子句等。
- 生成抽象语法树(AST),表示查询的语法结构。
优化器成本模型
优化器通过成本模型选择最有效的查询执行计划。成本模型考虑以下因素:
- 磁盘I/O:读取数据页和索引页的次数。
- CPU时间:执行查询所需的CPU时间。
- 内存使用:查询过程中使用的内存量。
执行计划分析(EXPLAIN)
使用EXPLAIN命令可以查看查询的执行计划。执行计划包括以下信息:
- 表扫描:全表扫描或索引扫描。
- 索引使用:是否使用索引。
- 连接类型:连接的类型,例如嵌套循环连接或哈希连接。
- 估计行数:查询返回的行数估计。
高级语法
MySQL支持多种高级语法,例如:
- 窗口函数:计算窗口内的聚合值。
- 公用表表达式(CTE):定义一个临时的结果集,可以在查询中多次引用。
- 递归查询:递归查询可以用于处理层次数据。
JSON路径表达式
JSON路径表达式用于从JSON文档中提取数据。例如,以下JSON路径表达式可以从JSON文档中提取名为"name"的值:
$.name
三、事务机制
隔离级别
事务的隔离级别决定了事务之间的可见性和互斥性。MySQL支持以下隔离级别:
- READ UNCOMMITTED:允许读取未提交的数据,可能导致脏读。
- READ COMMITTED:只允许读取已提交的数据,避免脏读。
- REPEATABLE READ:确保事务在执行过程中看到的数据是一致的,避免脏读和不可重复读。
- SERIALIZABLE:提供最严格的隔离级别,避免脏读、不可重复读和幻读。
幻读解决原理
幻读是指一个事务在执行过程中读取到的数据行数与提交事务时读取到的数据行数不一致。MySQL通过使用MVCC来避免幻读。
间隙锁实现
间隙锁用于防止幻读,通过锁定索引记录之间的间隙。间隙锁在以下情况下被使用:
- 使用范围查询。
- 使用INSERT、UPDATE、DELETE操作。
MVCC版本链
MVCC通过版本链来管理数据的多个版本。每个数据行都有一个版本号,用于跟踪数据的变化。
日志系统
MySQL使用日志系统来记录事务的变更,包括undo log和redo log。
- undo log:用于事务回滚,撤销未提交的更改。
- redo log:用于恢复数据,在系统崩溃后重放事务。
undo log回滚机制
undo log回滚机制如下:
- 当事务提交时,undo log会被标记为过时。
- 当事务回滚时,undo log中的更改会被应用到数据行上。
redo log
redo log用于恢复数据,在系统崩溃后重放事务。redo log记录以下信息:
- 数据行变更前的状态。
- 数据行变更后的状态。
两阶段提交
两阶段提交是一种分布式事务协议,它确保分布式事务的一致性。
binlog三种格式
binlog支持三种格式:
- STATEMENT:记录SQL语句本身。
- ROW:记录数据行的变更。
- MIXED:混合格式,记录SQL语句和数据行的变更。
四、索引体系
索引类型
MySQL支持多种索引类型,包括:
- B-Tree索引:最常用的索引类型,适用于范围查询和排序。
- 哈希索引:适用于等值查询。
- 全文索引:适用于搜索包含特定词汇的文本数据。
- 空间索引:适用于存储和查询地理空间数据。
全文索引(N-gram)
全文索引用于快速搜索包含特定词汇的文本数据。全文索引使用N-gram算法将文本数据分解成多个词元,并建立索引。
空间索引(R-Tree)
空间索引用于存储和查询地理空间数据。空间索引使用R-Tree数据结构来存储空间数据。
降序索引优化
降序索引可以优化特定类型的查询,例如范围查询和排序查询。
优化策略
索引优化策略包括以下内容:
- 索引创建:选择合适的索引类型和索引列。
- 索引维护:定期重建索引,删除无用的索引。
- 索引选择:根据查询需求选择合适的索引。
索引下推
索引下推可以减少数据库服务器的计算负担,将部分计算工作下推到存储引擎。
覆盖索引
覆盖索引可以满足查询而不需要访问数据行,从而提高查询性能。
索引合并
索引合并可以将多个索引的结果合并为一个结果集,从而提高查询性能。
五、高可用架构
复制技术
MySQL复制允许一个数据库服务器(主服务器)的数据被复制到另一个服务器(从服务器)。主服务器将数据变更记录在二进制日志中,从服务器读取二进制日志并应用数据变更。
GTID复制原理
GTID(全局事务标识符)复制提供了一种更高级的复制机制。GTID确保每个事务在主服务器和从服务器上都有唯一的标识符,从而简化了复制过程。
半同步复制
半同步复制确保数据在主服务器和从服务器之间至少同步一次。当从服务器确认已接收数据变更时,主服务器才会提交事务。
组复制(MGR)
组复制是MySQL 5.7引入的一种高可用复制技术。组复制允许多个服务器协同工作,提供高可用性和故障转移功能。
集群方案
集群方案包括以下内容:
- 主从复制:主服务器负责处理所有读写请求,从服务器负责读取请求。
- Galera复制:所有服务器协同工作,提供高可用性和故障转移功能。
InnoDB Cluster
InnoDB Cluster是MySQL 8.0引入的高可用解决方案。InnoDB Cluster包括以下组件:
- MySQL Router:用于路由查询到不同的后端数据库。
- Group Replication:用于处理数据复制和故障转移。
- MySQL Shell:用于管理InnoDB Cluster。
ProxySQL路由
ProxySQL是一个数据库代理,用于分发查询到多个后端数据库。ProxySQL支持多种路由策略,例如基于用户、应用程序或IP地址的路由。
Orchestrator管理
Orchestrator是一个工具,用于管理MySQL集群。Orchestrator支持以下功能:
- 复制监控。
- 故障转移。
- 资源管理。
六、性能调优
参数优化
调整MySQL配置参数可以优化性能。以下是一些常用的配置参数:
- innodb_buffer_pool_size:InnoDB缓冲池大小。
- innodb_log_file_size:InnoDB日志文件大小。
- max_connections:最大连接数。
- query_cache_size:查询缓存大小。
连接池配置
连接池管理数据库连接,减少连接开销。以下是一些常用的连接池配置:
- 最小连接数:连接池中的最小连接数。
- 最大连接数:连接池中的最大连接数。
- 最大等待时间:连接池等待连接的最大时间。
排序缓冲区
排序缓冲区用于优化排序操作。以下是一些常用的排序缓冲区配置:
- sort_buffer_size:排序缓冲区大小。
- read_rnd_buffer_size:读取随机缓冲区大小。
临时表策略
合理使用临时表可以提高性能。以下是一些常用的临时表策略:
- 使用InnoDB临时表:InnoDB临时表具有更好的性能。
- 使用内存临时表:内存临时表具有最快的性能。
- 避免使用MyISAM临时表:MyISAM临时表具有最差的性能。
监控工具
Performance Schema和Sys Schema是MySQL的监控工具。以下是一些常用的监控指标:
- 磁盘I/O:读取和写入磁盘的次数。
- CPU使用率:CPU使用率。
- 内存使用率:内存使用率。
- 连接数:连接数。
Slow Query分析
分析慢查询日志可以帮助识别性能瓶颈。以下是一些常用的慢查询分析工具:
- MySQL Workbench:MySQL Workbench内置了慢查询分析工具。
- Percona Toolkit:Percona Toolkit提供了多种慢查询分析工具。
通过以上对MySQL相关知识点的详细描述,我们可以看到各个知识点之间的紧密联系和相互影响。从存储引擎到SQL执行,再到事务和索引,最后到高可用性和性能调优,这些知识点共同构成了MySQL数据库的强大体系。理解和掌握这些知识点,对于数据库管理员和开发人员来说,是确保数据库稳定、高效运行的关键。
📥博主的人生感悟和目标

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

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