强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

MySQL 完全指南 / 第 1 章:MySQL 简介

第 1 章:MySQL 简介

了解 MySQL 的前世今生,选择正确的版本,在正确的场景使用正确的工具。


1.1 MySQL 发展历史

MySQL 是世界上最流行的开源关系型数据库管理系统(RDBMS)。其发展脉络如下:

年份 里程碑
1995 MySQL 1.0 发布,由瑞典公司 MySQL AB 开发
2000 采用 GPL 开源协议
2003 MySQL 4.0 发布,支持 UNION、子查询
2005 MySQL 5.0 发布,支持存储过程、触发器、视图
2008 Sun Microsystems 以 10 亿美元收购 MySQL AB
2010 Oracle 收购 Sun,MySQL 归入 Oracle 旗下
2013 MySQL 5.6 发布,支持全文索引(InnoDB)、GTID 复制
2015 MySQL 5.7 发布,支持 JSON 类型、Generated Column
2018 MySQL 8.0 发布,支持窗口函数、CTE、角色
2024 MySQL 8.4 LTS / 9.0 Innovation 发布
2025 MySQL 9.2 发布,HeatWave、向量存储等新特性

💡 MySQL 分支:由于 Oracle 对 MySQL 的控制,社区产生了多个分支:

  • MariaDB:由 MySQL 创始人 Monty 创建,兼容 MySQL 5.7 及之前版本
  • Percona Server:Percona 公司维护的企业增强版
  • PolarDB-X:阿里云的分布式 MySQL 兼容数据库

1.2 MySQL 版本选择

版本线对比

版本线 特点 适用场景
MySQL 5.7 最后一个经典版本,生态成熟 老项目维护、不支持 8.0 的中间件
MySQL 8.0 LTS 主流版本,功能丰富 新项目首选
MySQL 8.4 LTS 长期支持版本,稳定性优先 生产环境推荐
MySQL 9.x Innovation 创新版,功能最新 测试/开发环境

⚠️ 重要提示

  • MySQL 5.7 已于 2023 年 10 月 停止官方支持(EOL),强烈建议迁移到 8.0+
  • MySQL 8.0 将于 2026 年 4 月 停止支持,建议新项目直接使用 8.4 LTS
  • 生产环境避免使用 Innovation 版本,它每季度发布一次,稳定性不如 LTS

版本选择决策树

新项目?
├── 是 → MySQL 8.4 LTS(推荐)
│       └── 需要最新特性?→ 可用 9.x 在测试环境先行验证
└── 否(已有项目)
    ├── 当前 5.7 → 尽快规划升级到 8.0/8.4
    └── 当前 8.0 → 评估是否需要升级到 8.4 LTS

1.3 MySQL 适用场景

✅ 非常适合的场景

场景 说明
Web 应用后端 LAMP/LNMP 架构的核心组件
电商系统 交易数据管理,支持事务(ACID)
内容管理系统 WordPress、Drupal 等的默认数据库
日志存储 结合分区表存储海量日志数据
SaaS 多租户 Schema 级别或行级别的租户隔离
中小规模 OLTP 高并发读写,单表亿级数据仍可良好工作

⚠️ 不太适合的场景

场景 更好的选择
超大规模 OLAP(数据分析) ClickHouse、Doris、StarRocks
图数据库(社交关系推理) Neo4j、JanusGraph
文档型存储 MongoDB
时序数据 InfluxDB、TDengine
缓存层 Redis、Memcached
强一致性分布式事务 TiDB、CockroachDB

💡 混合使用是常态:一个系统中同时使用 MySQL + Redis + ES 是非常常见的架构。


1.4 MySQL vs PostgreSQL

这是开发者最常问的问题之一。以下是详细对比:

核心特性对比

特性 MySQL PostgreSQL
许可证 GPL v2 PostgreSQL License(更宽松)
默认端口 3306 5432
存储引擎 可插拔(InnoDB/MyISAM…) 单一引擎
ACID 事务 InnoDB 完全支持 完全支持
JSON 支持 5.7+ 支持,8.0 增强 9.2+ 支持,功能更强大
全文索引 InnoDB 支持(5.6+) 支持,性能更好
GIS 空间数据 基础支持 PostGIS 插件,功能强大
物化视图 不支持 支持
自定义类型 不支持 支持
窗口函数 8.0+ 支持 长期支持
CTE(递归查询) 8.0+ 支持 长期支持
分区表 支持 支持
逻辑复制 基础支持 功能更丰富
并发控制 MVCC(InnoDB) MVCC
最大连接数 默认 151,可调 默认 100,可调

性能对比

场景 MySQL PostgreSQL
简单 SELECT ⭐⭐⭐⭐⭐ 更快 ⭐⭐⭐⭐
复杂 JOIN ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 可能更优
高并发写入 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
大量并发连接 ⭐⭐⭐⭐⭐ 线程模型 ⭐⭐⭐ 进程模型(用 PgBouncer 解决)
OLAP 分析 ⭐⭐⭐ ⭐⭐⭐⭐
地理空间查询 ⭐⭐⭐ ⭐⭐⭐⭐⭐ PostGIS

生态对比

维度 MySQL PostgreSQL
云厂商支持 所有主流云厂商 所有主流云厂商
ORM 支持 所有主流语言 所有主流语言
管理工具 Navicat、DBeaver、phpMyAdmin pgAdmin、DBeaver
学习曲线 较低 中等
社区活跃度 非常高 非常高
中文文档 丰富 较丰富

如何选择?

选择 MySQL:
  ✓ 团队有 MySQL 经验
  ✓ 高并发读写 OLTP 为主
  ✓ 需要大量成熟中间件(如 ShardingSphere)
  ✓ WordPress、Laravel 等框架生态

选择 PostgreSQL:
  ✓ 需要复杂查询、GIS、自定义类型
  ✓ OLAP 和 OLTP 混合(HTAP)
  ✓ 需要物化视图、高级数据类型
  ✓ 对数据完整性要求极高

两者都可以:
  ✓ 标准 CRUD 业务(订单、用户、商品)
  ✓ 中小规模数据量(千万级以内)
  ✓ 不涉及特殊功能

1.5 MySQL 生态全景

核心组件

┌─────────────────────────────────────────────┐
│                 应用层                       │
│   Java / Python / Go / PHP / Node.js        │
│         ↓ JDBC / ORM / Driver               │
├─────────────────────────────────────────────┤
│               中间件层                       │
│  ProxySQL / MySQL Router / ShardingSphere    │
│         ↓ 连接池 / 路由 / 读写分离           │
├─────────────────────────────────────────────┤
│               MySQL Server                   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│  │ 连接层    │  │ SQL 层   │  │ 存储引擎  │   │
│  │ 认证/线程 │  │ 解析/优化│  │ InnoDB    │   │
│  └──────────┘  └──────────┘  └──────────┘   │
├─────────────────────────────────────────────┤
│               监控/运维                      │
│  Prometheus + Grafana / PMM / pt-tools       │
└─────────────────────────────────────────────┘

常用工具链

类别 工具 用途
官方工具 mysqlsh MySQL Shell,交互式管理
备份 mysqldump / xtrabackup 逻辑备份 / 物理备份
监控 Performance Schema 内置性能监控
监控 PMM (Percona) 企业级监控平台
迁移 gh-ost / pt-osc 在线表结构变更
测试 sysbench / mysqlslap 基准性能测试
中间件 ProxySQL 数据库代理
中间件 ShardingSphere 分布式数据库中间件

1.6 快速体验:30 秒启动 MySQL

如果你想立刻体验 MySQL,用 Docker 一行命令即可:

# 使用 Docker 快速启动 MySQL 8.4
docker run -d \
  --name mysql-quick \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -p 3306:3306 \
  mysql:8.4

# 进入 MySQL 命令行
docker exec -it mysql-quick mysql -uroot -pmy-secret-pw
-- 进入 MySQL 后,试试以下命令
SELECT VERSION();              -- 查看版本
SHOW DATABASES;                -- 查看所有数据库
CREATE DATABASE demo;          -- 创建数据库
USE demo;                      -- 切换到 demo
CREATE TABLE test (            -- 创建测试表
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO test (name) VALUES ('hello'), ('world');
SELECT * FROM test;            -- 查询数据

业务场景

场景 1:初创公司技术选型

某初创公司要开发一个电商系统,团队 5 人,主要用 Java/Spring Boot。

建议

  • 选择 MySQL 8.0/8.4 LTS,生态成熟,资料丰富
  • 团队学习成本低,ORM(MyBatis/Hibernate)支持完善
  • 初期单机部署即可,后期可平滑升级到主从架构
  • Redis 做缓存,MySQL 做持久化存储

场景 2:从 MySQL 5.7 升级

某公司运行 MySQL 5.7 已 3 年,面临 EOL 风险。

建议

  • 不要直接从 5.7 跳到 8.4,先升级到 8.0 验证兼容性
  • 关注 SQL Mode 变化(8.0 默认更严格)
  • 测试所有存储过程和视图的兼容性
  • 参考 第 19 章:数据迁移

扩展阅读