MySQL知识体系梳理
过往对MySQL的认识比较零碎,东一块西一块,经常忘记。最近花了点时间重新梳理了下,试图从整体的视角理解它,形成体系化的知识,这样既有助于记忆,也能够提升技术水平。内容是基于过往的工作经验,结合智能助手(Qwen3.5、Kimi2.5、Gemini3Flash)的帮助,最终整理出来,有些知识点仅仅是提了一下,后续会继续优化下细节,另外内容是个人的理解,有些地方可能有不对的地方,欢迎大家指出。
一. 整体视角

在进入正题之前,先简要介绍一下数据库的演变,常见的数据库包括如下类型:
1. 关系数据库,典型代表是MySQL
2. NoSql内存数据库,包括KV存储、文档数据库
3. NewSql数据库,TiDB, Oceanbase, 结合关系数据库和Nosql特点,既支持事务,又支持水平扩展
4. 垂直领域数据库,搜索、向量、时序数据库
二.模块介绍
接下来详细介绍下我对MySQL的理解,采用问答的方式
先说一下mysql 是什么,有什么特点
Mysql 是一个基于磁盘的关系数据库,支持事务、支持崩溃恢复,高可用,数据高可靠。
2.1. 整体架构
1. mysql 架构是什么
mysql采用分层架构,分为server层和存储引擎层
2. server层负责什么功能
server层包含连接器、分析器、优化器,执行器。
连接器
负责管理客户端连接、身份认证、权限验证,每个连接对应一个线程,默认采用One-Thread-Per-Connection 模型
8.0版本移除了查询缓存,表任何更新都会导致该表所有缓存失效,高并发下性能反而下降。
分析器
负责词法分析、语法分析,生成解析树
优化器
基于成本模型(Cost-Based Optimization, CBO),从多种可能的执行路径中选择最优执行计划。主要的优化任务包括
索引选择,JOIN 顺序重排等等
执行器
根据优化器生成的执行计划,调用存储引擎 API 获取数据,并完成最终结果组装。
3. 存储引擎层负责什么功能
存储引擎负责数据CRUD, 索引管理,事务支持,并发控制。
4. server层功能能否放到存储引擎层实现,比如优化器和执行器
技术上是可行的,现代很多数据库已经采用了计算靠近存储的思想。
对于mysql来说,如果将优化器、执行器下放到引擎层,则不同引擎之间需要重复实现,如果不同引擎实现不一致,效果也不一样
另外,放在server可以支持跨引擎的操作。弊端很多,除了不支持跨引擎操作,优化某个优化器bug,需要更新所有引擎,成本大。
4. 一条查询语句是如何执行的
与server层建立连接,分析器进行词法、语法分析、优化器生成执行计划,执行器负责调用存储引擎读写数据。
5. 为什么mysql并发数远低于redis
mysql对于每一个连接都新增一个线程处理,redis使用单线程,IO多路复用。首先线程创建开销大,包括线程自身资源堆栈,其次,调度开销大,导致cpu片上缓存,tlb失效等等。
另外,mysql操作比较重,涉及到多个锁、磁盘IO、读写文件,而redis是基于内存操作。
2.2. 数据存储
1. 有哪些存储引擎
从数据库宏观层面说,典型的存储引擎包括B+树,LSM树,此外还包括倒排索引、列式存储等等。
针对mysql而言,存储引擎有myISAM, InnoDB等等。
2. InnoDB存储引擎存储引擎特点
支持事务,行锁、间隙锁、临键锁,支持崩溃恢复。
3. InnoDB存储引擎如何存储数据
使用B+树存储数据,叶子节点存储行数据,非叶结点仅存储索引和下级节点指针
4. B+树特点
4.1 仅叶子节点存放数据
4.2 叶子节点指针连接,范围查询效率高
5. B+树与B树、红黑树等区别?为什么不使用其他树
B+树和B树是多叉树,红黑树是二叉树,B+树和B树因为是多叉树,树深度较低,多适用于磁盘操作,能够显著降低磁盘IO
相比B+树,B树任何节点既可以存储数据也可以存储索引,树深度比B+树高。
6. B+树通常深度是多少?怎么估算?
通常是2~3层,这个根据页大小、主键大小、数据量决定。非叶结点存储索引项,索引项里面包含索引值和指向下一层的指针。
如果索引比较大,则单个页存放的索引条目有限,如此就会加深B+树深度。
2.3. 索引
1. InnoDB索引是如何实现的
InnoDB支持哈希索引和B+树索引。
2. 索引有哪些类型
主键(聚簇)索引,二级(非聚簇)索引,多列索引。
3. 什么是主键索引(聚簇索引),什么是二级索引(非聚簇索引、联合索引),
主键索引内容包含行记录,二级索引存储的是主键ID,联合索引是一个多列索引。
4. 什么是回表
通过二级索引查询内容的时候,如果不满足覆盖索引,则需要回表查询行内容。回表最大的问题在于会产生随机读,
随机读会导致缓存大量失效,带来性能下降。
5. 最左索引前缀是什么
对于一个多列索引,如果仅使用该索引的前几个列,也能够命中索引,比如对于联合索引a_b_c,如果查询条件仅包含a或者a,b则也可以复用该索引
需要注意的是,对于一个多列索引,只要任意一个列使用了范围查询,则该列后面的字段无法使用。
6. 索引下推优化ICP是什么
这个主要用于利用索引中包含的信息提前进行过滤,减少回表数量。比如存在索引idx_a_b, 查询语句是select * from t where a> 5 and b=10;
普通的查询是使用索引idx_a_b,假设查询到1000条记录,此时需要回表读取1000次,继续判断条件b是否满足条件。如果使用ICP,存储引擎会
检查索引中b选项是否满足条件,如不满足则提前过滤,从而减少回表数量。
7. 索引失效场景
1. 对索引列使用函数
2. 类型转换
8. 如何建立高效的索引
1. 主键尽可能短、连续,选择区分度大的列放在前面,将范围查询列放到最后。主键太长会造成二级索引占空间比较大,树深度变深。
主键不连续容易导致页分裂,这会带来性能下降,其次索引列的区分度要大,否则索引效果会不好,比如性别字段只有2个选项,查询指定性别都会扫描
一般数据。
2.4. 事务与并发控制
1. 什么是事务?介绍一下ACID
事务是一组操作,要么全完成,要么全部完成,完成后数据不会丢失。
事务的特点是ACID,A表示原子性,C表示一致性,I表示隔离性,D表示持久化。
2. 隔离级别有哪些?
隔离级别包括读未提交,读提交,可重复读,串行化。
3. 脏读、不可重复读、幻读是什么问题?又是如何解决的
脏读是指读到其它事务未提交的数据。
不可重复读是指在同一个事务中前后两次读取到了同一行不同的数据。
幻读是指在同一个事务中,前后两次读,后一次读到了新的行。
脏读和不可重复读是通过一致性视图+undolog版本链解决。
幻读是通过next-key lock解决,
4. InnoDB事务是如何实现的
通过undolog版本链+一致性视图。
5. 介绍MVCC,undolog版本链、一致性视图,可见性判断
undolog记录了行的不同版本,每个版本包括改行对应的事务ID,指向上一个版本的指针,通过指针连接形成一个版本链。
一致性视图是指一个事务在事务期间能够看到的版本。
对于RC,每次查询都会新建一致性视图,对于RR,会在事务启动的时候创建一致性视图,在事务期间会一直使用该视图。
一致性视图里面包含如下内容,当前活跃的事务ID列表,minTransID 最小事务ID, maxTransID 最大的事务ID, 可见性判断规则
1. 如果当前版本对应的事务ID小于minTransID,说明是之前提交的,可见
2. 如果当前版本对应的事务ID大于maxTransID,说明是未来事务提交的,不可见
3. 如果当前版本对应的事务ID等于自身,可见
4. 如果当前版本对应的事务ID在minTransID,maxTransID之间,则检查是否在活跃事务列表之间,如果在,说明还未提交,不可见。
如果不在,说明在启动之前已经提交,可见。
6. 只读长事务的影响
只读长事务会导致undolog膨胀,因为undolog需要一直保留,防止只读长事务访问旧版本数据。undolog过大占用磁盘空间,严重情况下导致
磁盘满进而数据库不可用。另外只读长事务查询性能会很差,如果某个行更新了很多次导致undolog版本链过长,每次查询的时候需要遍历整个版本链
才能找到可见的数据。
7. 读写长事务的影响
只读长事务的影响在读写长事务场景下同样存在,不仅如此,对于读写长事务,因为更改数据会加锁,导致其它事务等待,如果自身频繁修改某一行数据,
导致该行版本链特别长,会影响其它查询业务性能。如果更改了大量数据生成大量的binlog,会一次性发送给从库,从库执行也需要一段时间,带来主从延迟。
如果回滚,会产生回滚风暴。
8. RR隔离级别下,幻读是如何解决的
在RR隔离级别下,InnoDB引擎解决的是快照读的幻读问题,这也是sql标准定义的幻读问题。但如果混用快照读和当前读还是会出现幻读问题。
比如在同一个事务之中,先使用快照读,后使用当前读。
9. RR隔离级别下,会出现不可重复读吗?
会出现,比如先使用快照读,在使用当前读。
9. mysql有哪些锁,分别介绍下功能
全局锁,表锁,元数据锁,意向锁,行锁、间隙锁,临键锁。
其中全局锁,表锁,元数据锁是server层
InnoDB锁包括行锁、间隙锁,临键锁、意向锁。
10. 为什么需要意向锁,使用表锁或者不行吗
使用表锁会限制并发数量,没有意向锁,修改
2.5. 高可用与高可靠,日志与复制
1. 有哪些日志?各自的作用是什么
undolog, 记录行的不同版本,形成版本链,配合MVCC实现事务。
redolog, innodb引擎独有,记录物理页的修改,追加写,循环写,三种刷盘策略? 主要用于崩溃恢复。
binlog, server层独有,记录逻辑日志,有不同的记录格式<行<可能出现主从不一致>,语句<内容可能太大>,mixed<结合行,语句模式的优点>>, 主要用于主从复制
relaylog,中转日志
2. redolog和binlog如何保持一致
通过两阶段提交,先写redolog prepare 状态,后更新binlog,再写redolog commit状态
3. 如何实现崩溃恢复
重启后检查redolog和binlog,如果redolog已经commit或者binlog完整,则提交事务,
如果binlog不完整则回滚
4. 能否使用binlog做崩溃恢复
binlog主要用于数据复制,记录的是逻辑日志,无法实现崩溃恢复。
5. 能否使用redolog做数据复制
redolog用于崩溃恢复,循环写,无法用于主从同步。
6. 数据复制策略都有哪些?
从早期的异步复制,到半同步复制再到组复制MGR
异步复制是主库写完binlog之后,返回客户端成功,异步复制到从机,存在数据丢失的可能性。
半同步复制是主库写完binlog之后,不返回客户端,而是等从机确认之后在提交。确保了至少有两份存储。
如果从库超时,则降级为异步复制。这里有几个名词需要注意,Lossless Semi-Synchronous Replication(无损半同步复制),其实就是
After-Sync模式
MGR是mysql 分布式部署的一种,存在两种拓扑模式,单主或者多主,每次写需要超过半数以上。
7. 主库延迟增加有哪些原因
1. 从库配置低
2. 大事务
3. 从库高负载
2.6. 性能优化
1. 常见卡顿原因都有哪些
1.1 大事务
1.2 死锁,锁竞争
1.3 慢查询
2. 如何优化索引
2.1 主键尽可能短,减少索引大小
2.2 索引字段区分度要大,区分度小等同于全表扫描
2.3 尽可能使用覆盖索引,利用索引进行范围查询
3. 海量数据如何存储,分库分表和内置的分区有什么区别
分库分表
分区是单机数据库内部功能,对应用完全透明,存在单点故障,受限于单机性能,支持事务,跨分区查询。
分库分表一般由应用层或中间件控制,需改代码或引入中间件。水平扩展,
4. 什么是深分页,为什么会出现这个问题,如何解决这个问题
指的是offset偏移过大,每次都要扫描大量无效行数据。
核心问题在于MVCC,需要检查每一行数据可见性。
优化手段:1. 游标查询 2.延迟关联 3.覆盖索引
5. mysql有哪些缓存
Buffer Pool 是 InnoDB 在内存中缓存数据页(Data Pages)和索引页(Index Pages) 的区域。
Change Buffer 用于缓存对非唯一二级索引(Secondary Index)的 INSERT/UPDATE/DELETE 操作,当对应的索引页不在 Buffer Pool 中时,延迟合并(Merge)到索引页。
目标:将随机 I/O 转化为顺序 I/O,大幅提升写入性能。
以下操作会导致buffer pool缓存命中率降低
1. 全表扫描,全表扫描会将大量冷数据页加载到 Buffer Pool。
2. 大结果集排序或临时表,这些操作会挤占buffer pool空间
3. 大事务
4. 冗余、重复索引,挤占空间
5. 刚启动,bufferpool为空,可以预热热点页。
2.7. 三方协同
1. 使用redis作缓存,如何保存数据一致性
一致性分为强一致性和弱一致性,强一致性又分为严格、线性、顺序一致性
弱一致性包含因果、会话、最终一致性。
根据CAP定理,要实现强一致性,可能需要牺牲可用性。
1.1 因为涉及到两个不同的存储,要想实现强一致,就得引入分布式共识协议,如paxos或者raft
管理复杂,而且也无法保证强一致。一般会实现最终一致性,通过延迟双删或者异步更新、定时同步等机制保证一致性
2.8. 其它
1. 如何实现分布式锁
三. AI建议
对于上述的总结,不同大模型给出了相应的反馈,都有点道理,后续再慢慢优化一下
3.1 Gemini3-Flash


3.2 Deepseek

3.3 Kimi2.5

Kimi2.5优化后的知识体系
MySQL知识体系
├── 0. 数据库宏观与选型
│ ├── 数据库演进(补充云原生、AI时代向量库)
│ └── 选型决策矩阵(QPS、延迟、成本、团队能力)
├── 1. 架构与原理
│ ├── 连接层(线程池、协议、连接池协同)
│ ├── Server层(Parser/Optimizer/Executor的8.0新特性)
│ ├── 存储引擎层(InnoDB的内存+磁盘架构详解)
│ └── 物理文件(表空间、日志文件、Double Write Buffer)
├── 2. 数据存储与文件结构
│ ├── B+树原理与页结构(深度优先掌握Page结构)
│ ├── 行格式与压缩(Dynamic、Compressed)
│ └── 表空间管理(独立表空间、通用表空间、Undo表空间)
├── 3. 索引与优化器
│ ├── 索引类型与结构(补充函数索引、不可见索引)
│ ├── 统计信息与Histogram(Cardinality计算、采样优化)
│ ├── 执行计划分析(EXPLAIN FORMAT=JSON、Optimizer Trace)
│ └── 索引优化实战(慢查询分析、索引推荐工具)
├── 4. 事务与并发控制
│ ├── ACID实现机制(Redo/Undo/Binlog的详细对比)
│ ├── MVCC深度原理(Read View的8.0优化、Purge机制)
│ ├── 锁机制(锁的内存结构、死锁检测、锁监控)
│ └── 隔离级别与异常(Snapshot Read vs Current Read的交互)
├── 5. 高可用与复制
│ ├── 日志系统(Redo Log的LSN、Checkpoint机制、Binlog的GTID)
│ ├── 复制架构(异步/半同步/MGR、级联复制、Binlog Server)
│ ├── 故障转移(MHA/Orchestrator/手动切换的RTO/RPO对比)
│ └── 读写分离与负载均衡(ProxySQL、ShardingSphere)
├── 6. 性能优化与诊断
│ ├── 查询优化(Join、子查询、排序、分页的完整方案)
│ ├── 写入优化(批量、缓冲、主键顺序、禁用检查)
│ ├── 内存优化(Buffer Pool、Change Buffer、Adaptive Hash Index)
│ └── 诊断工具(Performance Schema、sys schema、pt-query-digest)
├── 7. 扩展性与分布式
│ ├── 分库分表(Sharding策略、全局ID、分布式事务)
│ ├── 分区表(与分库分表的对比、分区修剪)
│ ├── 云数据库(PolarDB、Aurora的架构优势)
│ └── HTAP(TiFlash、PolarDB-X的列存引擎)
└── 8. 生态协同
├── 缓存一致性(CDC、延迟双删、多级缓存架构)
├── 分布式锁(MySQL/Redis/etcd的实现对比)
└── 数据迁移与同步(DTS、Canal、Flink CDC)
四.参考资料
1. 《MySQL 45讲》
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)