第 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 章:数据迁移