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

12 KiB
Raw Blame History

tags, create time
tags create time
MySQL
Database
SQL
RDBMS
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 安装与初始化 Community Edition 安装、Docker Compose、mysql_install_db、配置文件层级 (my.cnf)
1.3 客户端工具 mysql CLI、mysqlsh、Workbench、HeidiSQL、DBeaver;常用 \G、\h 等快捷命令
1.4 数据类型全景 整型(TINYINT~BIGINT)、浮点(FLOAT / DOUBLE / DECIMAL)、字符串(CHAR / VARCHAR / TEXT / BLOB)、日期时间(DATE / DATETIME / TIMESTAMP / TIME)、JSON
1.5 字符集与排序规则 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 其他存储引擎概览 MyISAM / Memory / Archive 各自适用场景、为什么生产环境几乎只用 InnoDB
2.3 表结构设计三范式 1NF ~ 3NF、反范式取舍、冗余字段的设计哲学
2.4 主键策略对比 Auto-increment / UUID / Snowflake / ULID —— 各方案对索引碎片化的影响
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 子查询与派生表 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 聚簇索引与二级索引 Secondary Index 回表、Covering Index(覆盖索引)、Index Only Scan
4.3 联合索引与最左前缀 (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 慢查询日志分析 slow_query_log 配置、pt-query-digest、mysqldumpslow
4.6 查询改写技巧 JOIN → EXISTS 转换、UNION ALL 拆分 OR、避免函数作用于索引列
4.7 深分页优化 LIMIT 1000000, 20 的陷阱、延迟关联(Deferred Join)、游标分页
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 隔离级别与可见性 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 锁机制总览 全局锁、表级锁(MDL)、行级锁(Record Lock / Next-Key Lock / Gap Lock)
5.5 死锁与排查 SHOW ENGINE INNODB STATUS、等待图、减少锁竞争的策略
5.6 一致性读 vs 当前读 SELECT 一致性读、LOCK IN SHARE MODE / FOR UPDATE 当前读
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 主从复制详解 Semi-Sync 半同步、GTID 复制、并行复制(MTS)、延迟监控
6.3 MHA 与 Orchestrator 自动故障检测与切换、脑裂处理
6.4 [Group Replication](./32-Group Replication.md) Paxos 共识、单主/多主模式、冲突检测
6.5 [InnoDB Cluster](./33-InnoDB Cluster.md) MySQL Shell + Router + Monitor,官方一键部署方案
6.6 备份与恢复 mysqldump(逻辑)、Percona XtraBackup(物理)、PITR 时间点恢复
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 分库分表 ShardingSphere、Vitess、水平切分(Hash / Range / List)、跨分片查询
7.4 监控指标 QPS/TPS、Slow Query Count、Innodb Buffer Pool Hit Rate、Threads Connected、Replication Lag
7.5 安全加固 最小权限原则、SSL/TLS 加密传输、审计日志、防止 SQL 注入
7.6 常见踩坑 ORDER BY 文件排序、COUNT(*) vs COUNT(1)、timestamp 自动更新

hhs/DEV/Go-Database — Go 中 sql.DB 的连接池使用模式

学习路径建议

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

关联笔记