refactor: rewrite MySQL README overview and content descriptions

- 概述重写:去掉术语堆砌,改为大白话和三条学习路线
- 各节说明精简:去掉英文缩写,保留核心意思
- 学习路径重排:SQL → 索引 → 存储引擎 → 表设计
This commit is contained in:
hhs
2026-05-20 16:14:41 +08:00
parent ebf9db844d
commit 115c952200
+81 -56
View File
@@ -7,13 +7,39 @@ create time: 2026-05-16 00:00
## 概述 ## 概述
本文件夹系统整理 MySQL 的核心知识点,从底层架构到生产实践,覆盖日常开发和高阶场景。MySQL 是世界上最流行的开源关系型数据库,掌握它不仅是后端开发的必备技能,更是理解"数据如何持久化"这一根本问题的钥匙。 本文件夹系统整理 MySQL 的核心知识点。MySQL 是目前世界上最流行的关系型数据库,几乎所有后端项目都在用它——存用户数据、订单记录、配置信息……本质上它就是**一个帮你安全存放和查询数据的程序**。
> [!QUESTION] 为什么选 MySQL? ### 从零开始的三条学习路线
> - **生态成熟**:社区活跃、文档完善、云厂商全覆盖(RDS、PolarDB、TencentDB)
> - **存储引擎可插拔**:InnoDB 默认提供事务和行锁,MyISAM 适合只读分析,Memory 用于缓存 ```
> - **协议兼容性好**:标准 SQL + 丰富的方言扩展,驱动支持几乎所有主流语言 路线 A(日常开发) 路线 B(深入原理) 路线 C(运维 & 高可用)
> - **性能可预期**:B+ Tree 索引 + Buffer Pool + Redo Log 三层架构,让写入和查询都有章可循 ↓ ↓ ↓
基础语法 → SQL 查询 存储引擎 / 索引底层 主从复制 / 备份恢复
表设计 → CRUD 操作 事务 / 隔离级别 / MVCC 高可用方案 / 故障切换
连接池 → ORM 框架 EXPLAIN / 慢查询优化 监控 / 分库分表
```
> [!QUESTION] 怎么选?
> - **如果你是刚入门的后端开发**:走路线 A 就够了,搞定增删改查和表设计就能上手干活
> - **如果你想面试大厂或解决线上性能问题**:继续走路线 B,理解索引和事务底层原理
> - **如果你要负责生产环境运维**:路线 C 是必修课,主从、备份、故障切换一个不能少
> - **理想状态**:A → B → C,循序渐进
### 核心概念速览(不用现在全懂)
下面的术语你在后面会逐一遇到,先有个印象就行:
| 概念 | 一句话理解 |
|------|-----------|
| **数据库 (Database)** | 存放表的容器,类似一个项目文件夹 |
| **表 (Table)** | 按行和列组织的数据,像 Excel 表格 |
| **SQL** | 跟数据库沟通的语言,比如"把这条数据查出来" |
| **索引 (Index)** | 书的目录,让查找更快,不加索引就像一页页翻书 |
| **事务 (Transaction)** | 一组操作要么全部成功、要么全部回滚,保证数据不出错 |
| **InnoDB** | MySQL 默认的存储引擎,支持事务、行锁,生产环境几乎都用它 |
> [!TIP] 学习建议
> 不要试图一口气吃成胖子。先学会写 `SELECT` 和 `INSERT`,看到能查出数据,再慢慢往下挖。每一个高级主题(比如事务隔离级别)都建立在前面的基础之上。
## 知识体系 ## 知识体系
@@ -21,11 +47,11 @@ create time: 2026-05-16 00:00
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 1.1 | [MySQL 架构与进程模型](./01-MySQL 架构与进程模型.md) | Client-Server 模型、连接层 / SQL 层 / 引擎层 / 存储层;Server 线程 vs Worker 线程;`mysqld` 启动流程 | | 1.1 | [MySQL 架构概览](./01-MySQL 架构与进程模型.md) | MySQL 分几层(客户端 → SQL → 引擎 → 存储);`mysqld` 是怎么启动的 |
| 1.2 | [安装与初始化](./02-安装与初始化.md) | Community Edition 安装、Docker Compose、`mysql_install_db`、配置文件层级 (`my.cnf`) | | 1.2 | [安装与初始化](./02-安装与初始化.md) | 本地安装、Docker Compose 快速启动、基本配置文件 |
| 1.3 | [客户端工具](./03-客户端工具.md) | `mysql CLI`、`mysqlsh`、Workbench、HeidiSQL、DBeaver;常用 `\G`、`\h` 等快捷命令 | | 1.3 | [客户端工具](./03-客户端工具.md) | 命令行 `mysql`、DBeaver、Workbench,选一个顺手的就行 |
| 1.4 | [数据类型全景](./04-数据类型全景.md) | 整型(TINYINT~BIGINT)、浮点(FLOAT / DOUBLE / DECIMAL)、字符串(CHAR / VARCHAR / TEXT / BLOB)、日期时间(DATE / DATETIME / TIMESTAMP / TIME)、JSON | | 1.4 | [数据类型全景](./04-数据类型全景.md) | 整型、浮点、字符串、日期时间、JSON——每种类型适合存什么 |
| 1.5 | [字符集与排序规则](./05-字符集与排序规则.md) | utf8mb4 为什么比 utf8 重要、Collation 的 Binlog / Case 差异、`COLLATE` 关键字 | | 1.5 | [字符集与排序规则](./05-字符集与排序规则.md) | 为什么一定要用 `utf8mb4`、中文搜索不出来的坑 |
> [!TIP] 选择数据类型时,遵循「够用就好」原则 > [!TIP] 选择数据类型时,遵循「够用就好」原则
> 能用 TINYINT 就别用 INT,能用 DATETIME 就别用 STRING 存日期——这直接影响索引效率和存储空间。 > 能用 TINYINT 就别用 INT,能用 DATETIME 就别用 STRING 存日期——这直接影响索引效率和存储空间。
@@ -34,10 +60,10 @@ create time: 2026-05-16 00:00
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 2.1 | [InnoDB 深度解析](./06-InnoDB 深度解析.md) | Clustered Index、Change Buffer、Insert Buffer、Adaptive Hash Index | | 2.1 | [InnoDB 深度解析](./06-InnoDB 深度解析.md) | InnoDB 是怎么存数据的、聚簇索引的工作原理、缓冲机制概览 |
| 2.2 | [其他存储引擎概览](./07-其他存储引擎概览.md) | MyISAM / Memory / Archive 各自适用场景、为什么生产环境几乎只用 InnoDB | | 2.2 | [其他存储引擎概览](./07-其他存储引擎概览.md) | MyISAM / Memory / Archive 的适用场景,为什么生产几乎只用 InnoDB |
| 2.3 | [表结构设计三范式](./08-表结构设计三范式.md) | 1NF ~ 3NF、反范式取舍、冗余字段的设计哲学 | | 2.3 | [表结构设计三范式](./08-表结构设计三范式.md) | 什么是 1NF / 2NF / 3NF、什么时候该故意违反范式 |
| 2.4 | [主键策略对比](./09-主键策略对比.md) | Auto-increment / UUID / Snowflake / ULID —— 各方案对索引碎片化的影响 | | 2.4 | [主键策略对比](./09-主键策略对比.md) | 自增 ID、UUID、雪花算法——各自对性能的影响 |
```mermaid ```mermaid
graph TB graph TB
@@ -69,33 +95,33 @@ graph TB
style H fill:#A0AEC0,color:#fff style H fill:#A0AEC0,color:#fff
``` ```
> [!NOTE] InnoDB 的核心缓冲机制 > [!NOTE] InnoDB 的三个关键机制(先有个印象,后面详解)
> - **Buffer Pool**:热数据页的内存缓存,命中率应在 99%+ > - **Buffer Pool**:内存里的"草稿纸",频繁访问的数据先放这里,减少磁盘读取
> - **Redo Log**:保证 durability,循环写入,崩溃恢复时使用 > - **Redo Log**:操作日志,数据库崩溃了靠它恢复数据
> - **Undo Log**:支持 MVCC 和多版本读,rollback 也用它 > - **Undo Log**:撤销日志,回滚和版本控制靠它
### 三、SQL 精解 ### 三、SQL 精解
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 3.1 | [DDL — 建表与结构变更](./10-DDL 建表与结构变更.md) | CREATE TABLE / ALTER TABLE、`ADD COLUMN` 在线变更、`ALGORITHM=INPLACE` | | 3.1 | [DDL — 建表与结构变更](./10-DDL 建表与结构变更.md) | 怎么创建和修改表结构、大表加字段会不会锁表 |
| 3.2 | [DML — 增删改](./11-DML 增删改.md) | INSERT ... ON DUPLICATE KEY UPDATE、REPLACE INTO、DELETE vs TRUNCATE | | 3.2 | [DML — 增删改](./11-DML 增删改.md) | INSERT / UPDATE / DELETE 的常用技巧和坑 |
| 3.3 | [DQL — SELECT 全解析](./12-DQL SELECT 全解析.md) | SELECT 执行顺序、DISTINCT、GROUP BY 优化、LIMIT 深分页问题 | | 3.3 | [DQL — SELECT 全解析](./12-DQL SELECT 全解析.md) | SELECT 的执行顺序、去重、分组、分页——查对数据是日常开发的核心能力 |
| 3.4 | [JOIN 原理与优化](./13-JOIN 原理与优化.md) | Inner / Left / Right / Cross JOIN、Index Merge、Nested Loop Join、Block Nested Loop | | 3.4 | [JOIN 原理与优化](./13-JOIN 原理与优化.md) | 多张表怎么连起来查、Nested Loop 是怎么工作的 |
| 3.5 | [子查询与派生表](./14-子查询与派生表.md) | WHERE 子查询 vs FROM 子查询、EXISTS / IN / ANY 语义差异、Derived Table 物化 | | 3.5 | [子查询与派生表](./14-子查询与派生表.md) | WHERE / FROM 里的子查询什么时候用、EXISTS 和 IN 有什么区别 |
| 3.6 | [UNION 与集合运算](./15-UNION 与集合运算.md) | 集合运算、去重 vs 保留重复、合并字段类型推断 | | 3.6 | [UNION 与集合运算](./15-UNION 与集合运算.md) | 把多个查询结果合并在一起,去重 vs 保留重复怎么处理 |
### 四、索引与查询优化 ### 四、索引与查询优化
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 4.1 | [B+ Tree 索引原理](./16-B+Tree 索引原理.md) | 为什么不用 B 树 / Hash / 红黑树?非叶子节点只存键、叶子节点链表串联 | | 4.1 | [B+ Tree 索引原理](./16-B+Tree 索引原理.md) | MySQL 为什么选 B+ Tree、它比 Hash / 红黑树好在哪里 |
| 4.2 | [聚簇索引与二级索引](./17-聚簇索引与二级索引.md) | Secondary Index 回表、Covering Index(覆盖索引)、Index Only Scan | | 4.2 | [聚簇索引与二级索引](./17-聚簇索引与二级索引.md) | 数据存在哪棵树上、查二级索引为什么要"回表" |
| 4.3 | [联合索引与最左前缀](./18-联合索引与最左前缀.md) | (a,b,c) 的使用模式、为什么 b 单独查不了、隐式类型转换导致索引失效 | | 4.3 | [联合索引与最左前缀](./18-联合索引与最左前缀.md) | 多个字段一起建索引怎么用、为什么跳列就用不上了 |
| 4.4 | [EXPLAIN 完全指南](./19-EXPLAIN 完全指南.md) | type 字段(ALL/index/ref/range/eq_ref/system)、Extra(Using where/index/filesort/temporary)| | 4.4 | [EXPLAIN 完全指南](./19-EXPLAIN 完全指南.md) | 怎么看 SQL 的执行计划、type 从优到差排哪些 |
| 4.5 | [慢查询日志分析](./20-慢查询日志分析.md) | `slow_query_log` 配置、`pt-query-digest`、`mysqldumpslow` | | 4.5 | [慢查询日志分析](./20-慢查询日志分析.md) | 抓出执行慢的 SQL、用工具分析根因 |
| 4.6 | [查询改写技巧](./21-查询改写技巧.md) | JOIN → EXISTS 转换、UNION ALL 拆分 OR、避免函数作用于索引列 | | 4.6 | [查询改写技巧](./21-查询改写技巧.md) | OR → UNION ALL、JOIN → EXISTS,同样的结果写法影响性能 |
| 4.7 | [深分页优化](./22-深分页优化.md) | `LIMIT 1000000, 20` 的陷阱、延迟关联(Deferred Join)、游标分页 | | 4.7 | [深分页优化](./22-深分页优化.md) | `LIMIT 1000000, 20` 为什么慢、怎么优化 |
```mermaid ```mermaid
flowchart LR flowchart LR
@@ -125,12 +151,12 @@ flowchart LR
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 5.1 | [ACID 与原子性实现](./23-ACID 与原子性实现.md) | Redo Log(物理 WAL)+ Undo Log(逻辑回滚)的组合拳 | | 5.1 | [ACID 与原子性实现](./23-ACID 与原子性实现.md) | 什么是 ACID、Redo Log + Undo Log 怎么保证不出错 |
| 5.2 | [隔离级别与可见性](./24-隔离级别与可见性.md) | Read Uncommitted / Read Committed / Repeatable Read / Serializable | | 5.2 | [隔离级别与可见性](./24-隔离级别与可见性.md) | 四个隔离级别各是什么意思,MySQL 默认的是哪个 |
| 5.3 | [MVCC 原理](./25-MVCC 原理.md) | Read View + Undo Log version chain、RC 下每次 SELECT 新建 Read View、RR 下第一次 SELECT 创建 | | 5.3 | [MVCC 原理](./25-MVCC 原理.md) | 不加锁也能并发读的秘密——多版本并发控制 |
| 5.4 | [锁机制总览](./26-锁机制总览.md) | 全局锁、表级锁(MDL)、行级锁(Record Lock / Next-Key Lock / Gap Lock)| | 5.4 | [锁机制总览](./26-锁机制总览.md) | 从全局锁到行级锁,MySQL 在不同场景下锁什么 |
| 5.5 | [死锁与排查](./27-死锁与排查.md) | `SHOW ENGINE INNODB STATUS`、等待图、减少锁竞争的策略 | | 5.5 | [死锁与排查](./27-死锁与排查.md) | 什么时候会发生死锁、怎么定位和避免 |
| 5.6 | [一致性读 vs 当前读](./28-一致性读与当前读.md) | `SELECT` 一致性读、`LOCK IN SHARE MODE / FOR UPDATE` 当前读 | | 5.6 | [一致性读 vs 当前读](./28-一致性读与当前读.md) | 普通 SELECT 读到什么、加 FOR UPDATE 又读到什么 |
```mermaid ```mermaid
sequenceDiagram sequenceDiagram
@@ -149,20 +175,20 @@ sequenceDiagram
T1->>DB: COMMIT; T1->>DB: COMMIT;
``` ```
> [!NOTE] RC vs RR 的关键区别 > [!NOTE] RC vs RR 的关键区别(面试常考)
> - **RC (Read Committed)**:每次 SELECT 都新建 Read View → 能看到其他事务已提交的修改(不可重复读) > - **RC (Read Committed)**:每次查都能看到别的事务刚提交的数据 → 可能出现"不可重复读"
> - **RR (Repeatable Read)**:同一个事务内第一次 SELECT 创建 Read View → 整个事务看到一致快照(可重复读),配合 Next-Key Lock 解决幻影读 > - **RR (Repeatable Read)**:整个事务内看到的是同一个快照 → 数据一致,这也是 MySQL 的默认设置
### 六、高可用与分布式 ### 六、高可用与分布式
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 6.1 | [Binary Log(Binlog)](./29-Binary Log.md) | Row / Statement / Mixed 格式、binlog_cache、`mysqlbinlog` 工具 | | 6.1 | [Binary Log(Binlog)](./29-Binary Log.md) | Binlog 记录了所有写操作,主从复制和恢复都靠它 |
| 6.2 | [主从复制详解](./30-主从复制详解.md) | Semi-Sync 半同步、GTID 复制、并行复制(MTS)、延迟监控 | | 6.2 | [主从复制详解](./30-主从复制详解.md) | 数据怎么从主库同步到从库、半同步 vs 异步的区别 |
| 6.3 | [MHA 与 Orchestrator](./31-MHA与Orchestrator.md) | 自动故障检测与切换、脑裂处理 | | 6.3 | [MHA 与 Orchestrator](./31-MHA与Orchestrator.md) | 主库挂了怎么自动切换到从库 |
| 6.4 | [Group Replication](./32-Group Replication.md) | Paxos 共识、单主/多主模式、冲突检测 | | 6.4 | [Group Replication](./32-Group Replication.md) | 多主同时写入、冲突怎么处理 |
| 6.5 | [InnoDB Cluster](./33-InnoDB Cluster.md) | MySQL Shell + Router + Monitor,官方一键部署方案 | | 6.5 | [InnoDB Cluster](./33-InnoDB Cluster.md) | MySQL 官方的高可用集群方案 |
| 6.6 | [备份与恢复](./34-备份与恢复.md) | mysqldump(逻辑)、Percona XtraBackup(物理)、PITR 时间点恢复 | | 6.6 | [备份与恢复](./34-备份与恢复.md) | 全量备份和增量备份、恢复到任意时间点 |
```mermaid ```mermaid
flowchart LR flowchart LR
@@ -184,20 +210,19 @@ flowchart LR
``` ```
> [!TIP] 生产环境的主从架构建议 > [!TIP] 生产环境的主从架构建议
> - 至少 **一主两从**,使用 GTID + Semi-Sync 保证数据不丢 > - 至少 **一主两从**,读写分离时注意刚写的数据可能读不到(有延迟)
> - 读写分离时注意 **弱一致性风险**:刚写的数据可能读不到 > - 定期做 **灾备演练**,别等挂了才知道切换不成功
> - 定期做 **灾备演练**,验证切换时间和数据完整性
### 七、工程实践 ### 七、工程实践
| # | 主题 | 说明 | | # | 主题 | 说明 |
|---|------|------| |---|------|------|
| 7.1 | [Go 连接池配置](./35-Go 连接池配置.md) | `sql.DB` 参数调优:MaxOpenConns、MaxIdleConns、ConnMaxLifetime、ConnMaxIdleTime | | 7.1 | [Go 连接池配置](./35-Go 连接池配置.md) | `sql.DB` 几个关键参数的含义和调优思路 |
| 7.2 | [Schema 迁移管理](./36-Schema 迁移管理.md) | flyway / goose / migrate、版本化迁移脚本、幂等性设计 | | 7.2 | [Schema 迁移管理](./36-Schema 迁移管理.md) | 版本化的建表脚本、谁在用、怎么保证可回滚 |
| 7.3 | [分库分表](./37-分库分表.md) | ShardingSphere、Vitess、水平切分(Hash / Range / List)、跨分片查询 | | 7.3 | [分库分表](./37-分库分表.md) | 数据量太大时怎么拆分、跨分片查询怎么办 |
| 7.4 | [监控指标](./38-监控指标.md) | QPS/TPS、Slow Query Count、Innodb Buffer Pool Hit Rate、Threads Connected、Replication Lag | | 7.4 | [监控指标](./38-监控指标.md) | QPS/TPS、慢查询数、连接数——哪些数据决定数据库健康 |
| 7.5 | [安全加固](./39-安全加固.md) | 最小权限原则、SSL/TLS 加密传输、审计日志、防止 SQL 注入 | | 7.5 | [安全加固](./39-安全加固.md) | 权限管理、加密传输、SQL 注入防护 |
| 7.6 | [常见踩坑](./40-常见踩坑.md) | `ORDER BY` 文件排序、`COUNT(*)` vs `COUNT(1)`、`timestamp` 自动更新 | | 7.6 | [常见踩坑](./40-常见踩坑.md) | ORDER BY 文件排序、COUNT 的区别、timestamp 自动更新 |
[[hhs/DEV/Go-Database]] — Go 中 sql.DB 的连接池使用模式 [[hhs/DEV/Go-Database]] — Go 中 sql.DB 的连接池使用模式