This repository has been archived on 2026-05-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
all-in-kingsoft/hhs/MySQL/README.md
T
2026-05-17 00:06:11 +08:00

229 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [MySQL, Database, SQL, RDBMS]
create time: 2026-05-16 00:00
---
# MySQL 知识库
## 概述
本文件夹系统整理 MySQL 的核心知识点,从底层架构到生产实践,覆盖日常开发和高阶场景。MySQL 是世界上最流行的开源关系型数据库,掌握它不仅是后端开发的必备技能,更是理解"数据如何持久化"这一根本问题的钥匙。
> [!QUESTION] 为什么选 MySQL?
> - **生态成熟**:社区活跃、文档完善、云厂商全覆盖(RDS、PolarDB、TencentDB)
> - **存储引擎可插拔**:InnoDB 默认提供事务和行锁,MyISAM 适合只读分析,Memory 用于缓存
> - **协议兼容性好**:标准 SQL + 丰富的方言扩展,驱动支持几乎所有主流语言
> - **性能可预期**:B+ Tree 索引 + Buffer Pool + Redo Log 三层架构,让写入和查询都有章可循
## 知识体系
### 一、入门基础
| # | 主题 | 说明 |
|---|------|------|
| 1.1 | [MySQL 架构与进程模型](./01-MySQL 架构与进程模型.md) | Client-Server 模型、连接层 / SQL 层 / 引擎层 / 存储层;Server 线程 vs Worker 线程;`mysqld` 启动流程 |
| 1.2 | [安装与初始化](./02-安装与初始化.md) | Community Edition 安装、Docker Compose、`mysql_install_db`、配置文件层级 (`my.cnf`) |
| 1.3 | [客户端工具](./03-客户端工具.md) | `mysql CLI`、`mysqlsh`、Workbench、HeidiSQL、DBeaver;常用 `\G`、`\h` 等快捷命令 |
| 1.4 | [数据类型全景](./04-数据类型全景.md) | 整型(TINYINT~BIGINT)、浮点(FLOAT / DOUBLE / DECIMAL)、字符串(CHAR / VARCHAR / TEXT / BLOB)、日期时间(DATE / DATETIME / TIMESTAMP / TIME)、JSON |
| 1.5 | [字符集与排序规则](./05-字符集与排序规则.md) | utf8mb4 为什么比 utf8 重要、Collation 的 Binlog / Case 差异、`COLLATE` 关键字 |
> [!TIP] 选择数据类型时,遵循「够用就好」原则
> 能用 TINYINT 就别用 INT,能用 DATETIME 就别用 STRING 存日期——这直接影响索引效率和存储空间。
### 二、存储引擎与表设计
| # | 主题 | 说明 |
|---|------|------|
| 2.1 | [InnoDB 深度解析](./06-InnoDB 深度解析.md) | Clustered Index、Change Buffer、Insert Buffer、Adaptive Hash Index |
| 2.2 | [其他存储引擎概览](./07-其他存储引擎概览.md) | MyISAM / Memory / Archive 各自适用场景、为什么生产环境几乎只用 InnoDB |
| 2.3 | [表结构设计三范式](./08-表结构设计三范式.md) | 1NF ~ 3NF、反范式取舍、冗余字段的设计哲学 |
| 2.4 | [主键策略对比](./09-主键策略对比.md) | Auto-increment / UUID / Snowflake / ULID —— 各方案对索引碎片化的影响 |
```mermaid
graph TB
subgraph "SQL Layer"
A["Parser"] --> B["Preprocessor"]
B --> C["Optimizer"]
C --> D["Executor"]
end
subgraph "Storage Engine<br/>InnoDB"
D --> E["Buffer Pool"]
E --> F["Redo Log"]
E --> G["Undo Log"]
E --> H["Data File"]
D --> I["Change Buffer"]
end
subgraph "OS Layer"
H --> J["Page Cache"]
F --> K["I/O Subsystem"]
G --> K
end
style A fill:#4FC08D,color:#fff
style C fill:#FF9F43,color:#000
style E fill:#00B6BC,color:#fff
style F fill:#EE5A24,color:#fff
style G fill:#C44569,color:#fff
style H fill:#A0AEC0,color:#fff
```
> [!NOTE] InnoDB 的核心缓冲机制
> - **Buffer Pool**:热数据页的内存缓存,命中率应在 99%+
> - **Redo Log**:保证 durability,循环写入,崩溃恢复时使用
> - **Undo Log**:支持 MVCC 和多版本读,rollback 也用它
### 三、SQL 精解
| # | 主题 | 说明 |
|---|------|------|
| 3.1 | [DDL — 建表与结构变更](./10-DDL 建表与结构变更.md) | CREATE TABLE / ALTER TABLE、`ADD COLUMN` 在线变更、`ALGORITHM=INPLACE` |
| 3.2 | [DML — 增删改](./11-DML 增删改.md) | INSERT ... ON DUPLICATE KEY UPDATE、REPLACE INTO、DELETE vs TRUNCATE |
| 3.3 | [DQL — SELECT 全解析](./12-DQL SELECT 全解析.md) | SELECT 执行顺序、DISTINCT、GROUP BY 优化、LIMIT 深分页问题 |
| 3.4 | [JOIN 原理与优化](./13-JOIN 原理与优化.md) | Inner / Left / Right / Cross JOIN、Index Merge、Nested Loop Join、Block Nested Loop |
| 3.5 | [子查询与派生表](./14-子查询与派生表.md) | WHERE 子查询 vs FROM 子查询、EXISTS / IN / ANY 语义差异、Derived Table 物化 |
| 3.6 | [UNION 与集合运算](./15-UNION 与集合运算.md) | 集合运算、去重 vs 保留重复、合并字段类型推断 |
### 四、索引与查询优化
| # | 主题 | 说明 |
|---|------|------|
| 4.1 | [B+ Tree 索引原理](./16-B+Tree 索引原理.md) | 为什么不用 B 树 / Hash / 红黑树?非叶子节点只存键、叶子节点链表串联 |
| 4.2 | [聚簇索引与二级索引](./17-聚簇索引与二级索引.md) | Secondary Index 回表、Covering Index(覆盖索引)、Index Only Scan |
| 4.3 | [联合索引与最左前缀](./18-联合索引与最左前缀.md) | (a,b,c) 的使用模式、为什么 b 单独查不了、隐式类型转换导致索引失效 |
| 4.4 | [EXPLAIN 完全指南](./19-EXPLAIN 完全指南.md) | type 字段(ALL/index/ref/range/eq_ref/system)、Extra(Using where/index/filesort/temporary)|
| 4.5 | [慢查询日志分析](./20-慢查询日志分析.md) | `slow_query_log` 配置、`pt-query-digest`、`mysqldumpslow` |
| 4.6 | [查询改写技巧](./21-查询改写技巧.md) | JOIN → EXISTS 转换、UNION ALL 拆分 OR、避免函数作用于索引列 |
| 4.7 | [深分页优化](./22-深分页优化.md) | `LIMIT 1000000, 20` 的陷阱、延迟关联(Deferred Join)、游标分页 |
```mermaid
flowchart LR
A["SELECT 语句"] --> B["Parse Tree"]
B --> C["Query Optimizer"]
C --> D["Execution Plan"]
D --> E{type}
E -->|"system"<| F["最优:只有1行"]
E -->|"const"<| G["常量访问"]
E -->|"eq_ref"<| H["唯一索引,每行1次"]
E -->|"ref"<| I["非唯一索引,多行匹配"]
E -->|"range"<| J["索引范围扫描"]
E -->|"index"<| K["全索引扫描"]
E -->|"ALL"<| L["全表扫描 ⚠️"]
style L fill:#EE5A24,color:#fff
style F fill:#00B6BC,color:#fff
```
> [!QUESTION] 什么是最左前缀法则?
> 假设联合索引 `(city, age, sex)`,以下情况哪些能用上索引?
> - `WHERE city = 'Shanghai'` ✅ 第一列命中
> - `WHERE city = 'Shanghai' AND age = 20` ✅ 前两列连续命中
> - `WHERE age = 20 AND sex = 'M'` ❌ 跳过了第一列 city
> - `WHERE city = 'Shanghai' AND sex = 'M'` ⚠️ 用到 city 部分,sex 需额外过滤
### 五、事务与并发控制
| # | 主题 | 说明 |
|---|------|------|
| 5.1 | [ACID 与原子性实现](./23-ACID 与原子性实现.md) | Redo Log(物理 WAL)+ Undo Log(逻辑回滚)的组合拳 |
| 5.2 | [隔离级别与可见性](./24-隔离级别与可见性.md) | Read Uncommitted / Read Committed / Repeatable Read / Serializable |
| 5.3 | [MVCC 原理](./25-MVCC 原理.md) | Read View + Undo Log version chain、RC 下每次 SELECT 新建 Read View、RR 下第一次 SELECT 创建 |
| 5.4 | [锁机制总览](./26-锁机制总览.md) | 全局锁、表级锁(MDL)、行级锁(Record Lock / Next-Key Lock / Gap Lock)|
| 5.5 | [死锁与排查](./27-死锁与排查.md) | `SHOW ENGINE INNODB STATUS`、等待图、减少锁竞争的策略 |
| 5.6 | [一致性读 vs 当前读](./28-一致性读与当前读.md) | `SELECT` 一致性读、`LOCK IN SHARE MODE / FOR UPDATE` 当前读 |
```mermaid
sequenceDiagram
participant T1 as Transaction A
participant DB as InnoDB Engine
participant T2 as Transaction B
T1->>DB: BEGIN;
T2->>DB: BEGIN;
T1->>DB: SELECT balance FROM accounts WHERE id=1;
Note over T1,DB: 一致性读 → 返回历史版本(快照)
T2->>DB: UPDATE accounts SET balance=100 WHERE id=1;
T2->>DB: COMMIT;
T1->>DB: SELECT balance FROM accounts WHERE id=1 FOR UPDATE;
Note over T1,DB: 当前读 → 读取最新已提交记录 + X锁
T1->>DB: COMMIT;
```
> [!NOTE] RC vs RR 的关键区别
> - **RC (Read Committed)**:每次 SELECT 都新建 Read View → 能看到其他事务已提交的修改(不可重复读)
> - **RR (Repeatable Read)**:同一个事务内第一次 SELECT 创建 Read View → 整个事务看到一致快照(可重复读),配合 Next-Key Lock 解决幻影读
### 六、高可用与分布式
| # | 主题 | 说明 |
|---|------|------|
| 6.1 | [Binary Log(Binlog)](./29-Binary Log.md) | Row / Statement / Mixed 格式、binlog_cache、`mysqlbinlog` 工具 |
| 6.2 | [主从复制详解](./30-主从复制详解.md) | Semi-Sync 半同步、GTID 复制、并行复制(MTS)、延迟监控 |
| 6.3 | [MHA 与 Orchestrator](./31-MHA与Orchestrator.md) | 自动故障检测与切换、脑裂处理 |
| 6.4 | [Group Replication](./32-Group Replication.md) | Paxos 共识、单主/多主模式、冲突检测 |
| 6.5 | [InnoDB Cluster](./33-InnoDB Cluster.md) | MySQL Shell + Router + Monitor,官方一键部署方案 |
| 6.6 | [备份与恢复](./34-备份与恢复.md) | mysqldump(逻辑)、Percona XtraBackup(物理)、PITR 时间点恢复 |
```mermaid
flowchart LR
subgraph "Master"
W["Write / DML"] --> WL["Binlog Writer"]
end
subgraph "Network"
BL["Binlog Stream"] --> IO["IO Thread"]
end
subgraph "Slave"
IO --> SL["SQL Thread"]
SL --> SF["Slave Status Variables"]
end
WL -.->|异步/半同步| BL
SF -.->|Seconds_Behind_Master| Monitor["Monitoring"]
```
> [!TIP] 生产环境的主从架构建议
> - 至少 **一主两从**,使用 GTID + Semi-Sync 保证数据不丢
> - 读写分离时注意 **弱一致性风险**:刚写的数据可能读不到
> - 定期做 **灾备演练**,验证切换时间和数据完整性
### 七、工程实践
| # | 主题 | 说明 |
|---|------|------|
| 7.1 | [Go 连接池配置](./35-Go 连接池配置.md) | `sql.DB` 参数调优:MaxOpenConns、MaxIdleConns、ConnMaxLifetime、ConnMaxIdleTime |
| 7.2 | [Schema 迁移管理](./36-Schema 迁移管理.md) | flyway / goose / migrate、版本化迁移脚本、幂等性设计 |
| 7.3 | [分库分表](./37-分库分表.md) | ShardingSphere、Vitess、水平切分(Hash / Range / List)、跨分片查询 |
| 7.4 | [监控指标](./38-监控指标.md) | QPS/TPS、Slow Query Count、Innodb Buffer Pool Hit Rate、Threads Connected、Replication Lag |
| 7.5 | [安全加固](./39-安全加固.md) | 最小权限原则、SSL/TLS 加密传输、审计日志、防止 SQL 注入 |
| 7.6 | [常见踩坑](./40-常见踩坑.md) | `ORDER BY` 文件排序、`COUNT(*)` vs `COUNT(1)`、`timestamp` 自动更新 |
[[hhs/DEV/Go-Database]] — Go 中 sql.DB 的连接池使用模式
## 学习路径建议
```mermaid
flowchart TD
BASE["一、入门基础<br/>架构 + 数据类型"] --> CORE["二、存储引擎与表设计"]
CORE --> SQL["三、SQL 精解<br/>DDL/DML/DQL"]
SQL --> INDEX["四、索引与查询优化"]
SQL --> TXN["五、事务与并发控制"]
INDEX --> HA["六、高可用与分布式"]
TXN --> HA
HA --> ENG["七、工程实践<br/>分库分表 + 监控 + 安全"]
style BASE fill:#00B6BC,color:#fff
style INDEX fill:#FF9F43,color:#000
style TXN fill:#C44569,color:#fff
style HA fill:#4FC08D,color:#fff
style ENG fill:#EE5A24,color:#fff
```
## 关联笔记
- [[hhs/GORM/02-模型定义]] — GORM Model 如何映射到 MySQL 表和字段类型
- [[hhs/Redis/02-核心数据类型]] — MySQL 与 Redis 数据类型的对应关系和设计选型
- [[hhs/DEV/Go-Database]] — Go 连接 MySQL 的工程实践
- [[hhs/EXAM/Week05]] — Docker Compose 中的 MySQL 服务管理