第1章:数据库基础概念
本章目标
学完本章后,你将能够:
- 理解数据、数据库、DBMS 三个核心概念及其关系
- 区分关系型数据库与非关系型数据库,并了解各自的适用场景
- 掌握 SQL 的五大分类(DDL/DML/DQL/DCL/TCL)及各自职责
- 了解 MySQL 的发展历史、版本演进和两种发行版差异
- 理解 MySQL 的三层架构和常用存储引擎的区别
- 认识 MySQL 在真实世界中的应用场景
前置知识
- 本章是第1章,无需任何前置知识
- 基本的计算机操作能力即可
1.1 数据、数据库与数据库管理系统
什么是数据
数据(Data) 是描述客观事物的符号记录。在计算机科学中,数据不仅仅指数字——文本、图片、音频、视频、地理位置坐标、用户行为日志,都是数据。
从数据库管理系统的角度看,数据被组织成一条条的记录(Record):
| 学号 | 姓名 | 年龄 | 成绩 |
|---|---|---|---|
| 001 | 张三 | 18 | 92.5 |
| 002 | 李四 | 19 | 85.0 |
| 003 | 王五 | 18 | 78.5 |
上表中每一行就是一个学生的数据记录,每一列描述了一个属性。
什么是数据库
数据库(Database,简称 DB) 是按照一定结构组织、存储和管理数据的"仓库"。它不是简单的文件存储——数据库提供了高效的数据检索、修改、删除能力,同时确保数据的安全性、一致性和完整性。
可以把数据库想象成一个超级电子表格:
- 一个 Excel 文件能存几千行数据,查找靠 Ctrl+F
- 一个数据库能存几亿行数据,查找靠索引,毫秒级返回结果
- Excel 文件被一个人打开就锁定,数据库支持数千人同时读写
什么是数据库管理系统
数据库管理系统(Database Management System,简称 DBMS) 是管理数据库的软件系统。它是用户与数据库之间的桥梁:
用户/应用程序 → DBMS(如 MySQL) → 数据库(存储在磁盘上的文件)DBMS 提供以下核心功能:
- 数据定义:创建、修改、删除数据库和表结构
- 数据操作:增、删、改、查数据
- 数据安全:用户认证、权限控制
- 并发控制:多个用户同时操作时保证数据一致性
- 备份恢复:故障后恢复数据
- 数据完整性:通过约束保证数据正确
重要区分:MySQL 是 DBMS(数据库管理系统),不是数据库本身。就如同 Microsoft Word 是文字处理软件,不是文档本身。
1.2 关系型数据库 vs 非关系型数据库
数据库管理系统分为两大阵营:关系型和非关系型。
关系型数据库(RDBMS)
关系型数据库 以二维表(行和列)的形式组织数据,表与表之间通过外键建立"关系"。核心理论基础是 E.F. Codd 于 1970 年提出的关系模型。
主要特点:
- 数据以表(Table)的形式存储,每个表有固定的列(字段)
- 表之间通过关系(外键)关联
- 使用 SQL(结构化查询语言)操作数据
- 严格遵守 ACID 事务特性(原子性、一致性、隔离性、持久性)
- 数据模式(Schema)在使用前必须提前定义
常见的关系型数据库:MySQL、PostgreSQL、Oracle、SQL Server、SQLite。
非关系型数据库(NoSQL)
非关系型数据库 不采用固定的表结构,试图用更灵活的数据模型来解决关系型数据库难以处理的问题(如大规模数据、非结构化数据等)。"NoSQL" 不是"No SQL",而是"Not Only SQL"。
NoSQL 按数据模型分为四类:
| 类型 | 数据模型 | 代表产品 | 典型场景 |
|---|---|---|---|
| 键值存储 | Key → Value 简单映射 | Redis、Memcached | 缓存、会话存储 |
| 文档存储 | JSON/BSON/XML 文档 | MongoDB、CouchDB | 内容管理、用户配置 |
| 列族存储 | 列族(按列存储) | HBase、Cassandra | 日志分析、时序数据 |
| 图存储 | 节点 + 边 + 属性 | Neo4j、JanusGraph | 社交网络、推荐系统 |
关系型 vs 非关系型全面对比
| 对比维度 | 关系型数据库 (RDBMS) | 非关系型数据库 (NoSQL) |
|---|---|---|
| 数据模型 | 二维表,结构固定 | 键值/文档/列族/图,结构灵活 |
| Schema | 严格预定义,修改困难 | 动态 Schema,可随时添加字段 |
| 扩展方式 | 垂直扩展为主(升级硬件) | 水平扩展为主(增加节点) |
| 事务支持 | 完整 ACID 事务 | 多数只支持 BASE(最终一致性) |
| 数据一致性 | 强一致性 | 最终一致性为主 |
| 查询语言 | SQL(标准化) | 各产品自有 API |
| JOIN 能力 | 强大的多表连接 | 多数不支持 JOIN,需数据冗余 |
| 适用场景 | 复杂查询、事务性系统、数据一致性要求高 | 海量数据、高并发读写、数据结构多变 |
| 代表产品 | MySQL、PostgreSQL、Oracle | Redis、MongoDB、HBase |
选择建议:大多数业务系统(电商、CRM、ERP、金融系统)的核心数据应该使用关系型数据库。NoSQL 通常作为补充——比如用 Redis 做缓存加速,用 MongoDB 存储非结构化日志。不要在核心交易数据上使用 NoSQL,除非你非常清楚其中的取舍。
1.3 SQL 语言与五大分类
SQL(Structured Query Language,结构化查询语言) 是操作关系型数据库的标准语言。它由 IBM 在 1970 年代开发,1986 年被 ANSI 定为标准。所有主流关系型数据库都支持 SQL,但在标准之外各有扩展。
SQL 按功能分为五大类:
| 分类 | 全称 | 中文名称 | 核心动词 | 典型语句 |
|---|---|---|---|---|
| DDL | Data Definition Language | 数据定义语言 | CREATE、ALTER、DROP | 建库、建表、修改表结构、删除表 |
| DML | Data Manipulation Language | 数据操作语言 | INSERT、UPDATE、DELETE | 插入数据、更新数据、删除数据 |
| DQL | Data Query Language | 数据查询语言 | SELECT | 查询数据(最常用,也最复杂) |
| DCL | Data Control Language | 数据控制语言 | GRANT、REVOKE | 授予权限、撤销权限 |
| TCL | Transaction Control Language | 事务控制语言 | COMMIT、ROLLBACK、SAVEPOINT | 提交事务、回滚事务、设置保存点 |
各分类职责详解
DDL —— 定义"骨架":DDL 操作的是数据库对象(数据库、表、索引、视图等)的"结构"。DDL 操作通常是隐式提交的——执行后立即生效且无法回滚。
-- DDL 示例
CREATE DATABASE school; -- 创建数据库
CREATE TABLE student (id INT, name VARCHAR(20)); -- 创建表
ALTER TABLE student ADD COLUMN age INT; -- 修改表结构
DROP TABLE student; -- 删除表DML —— 操作"血肉":DML 操作的是表中存储的数据行。DML 操作通常放在事务中,可以提交(COMMIT)或回滚(ROLLBACK)。
-- DML 示例
INSERT INTO student VALUES (1, '张三', 18); -- 插入数据
UPDATE student SET age = 19 WHERE id = 1; -- 更新数据
DELETE FROM student WHERE id = 1; -- 删除数据DQL —— "眼睛":DQL 只有一个核心语句 SELECT,但它是最复杂、最常用的。从简单的全表查询到复杂的多表 JOIN + 子查询 + 聚合 + 排序 + 分页,都是 SELECT 的范畴。
-- DQL 示例
SELECT * FROM student; -- 查所有
SELECT name, age FROM student WHERE age > 18; -- 条件查询
SELECT COUNT(*) FROM student; -- 聚合计数DCL —— "门禁":控制谁能访问什么数据。
-- DCL 示例
GRANT SELECT ON school.* TO 'user1'@'localhost'; -- 授予查询权限
REVOKE INSERT ON school.* FROM 'user1'@'localhost'; -- 撤销插入权限TCL —— "安全网":保证一组操作要么全部成功,要么全部失败。
-- TCL 示例
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 确认转账 / ROLLBACK; 取消转账1.4 MySQL 发展历史
诞生(1995)
MySQL 由瑞典公司 MySQL AB 开发,创始人是 Michael "Monty" Widenius(芬兰人)和 David Axmark(瑞典人)。名字中的"My"来自 Monty 的女儿 My,而不是"我的 SQL"。
1995 年 5 月 23 日,MySQL 1.0 内部发布。1996 年,MySQL 3.11.1 首次公开发布。
最初的 MySQL 只支持基本的 SQL 功能,底层存储引擎使用的是 ISAM(后来发展为 MyISAM)。
主要版本演进
| 版本 | 发布时间 | 重要特性 |
|---|---|---|
| 3.23 | 2001 | 支持 InnoDB 引擎(事务、行级锁、外键)、全文索引 |
| 4.0 | 2003 | 支持 UNION、多表 DELETE、查询缓存、InnoDB 成为可选引擎 |
| 4.1 | 2004 | 支持子查询、预处理语句、字符集和排序规则的完整支持、GROUP BY 增加 ROLLUP |
| 5.0 | 2005 | 支持视图、存储过程、触发器、游标、INFORMATION_SCHEMA |
| 5.1 | 2008 | 支持分区、事件调度器、基于行的复制、插件式存储引擎 API |
| 5.5 | 2010 | InnoDB 成为默认存储引擎、半同步复制、SIGNAL/RESIGNAL |
| 5.6 | 2013 | 全文索引支持 InnoDB、GTID 复制、在线 DDL、性能大幅提升 |
| 5.7 | 2015 | JSON 数据类型、虚拟列、原生支持 JSON 函数、改进查询优化器 |
| 8.0 | 2018 | 重大版本跳跃(跳过 6、7):原子 DDL、窗口函数、CTE、角色、降序索引、隐藏索引、数据字典统一为 InnoDB、移除查询缓存 |
值得注意:MySQL 从 5.7 直接跳到 8.0,跳过了 6 和 7。官方解释是因为 6.0 和 7.0 各有一些规划中的功能,最终认为这些功能应该整合到一个更大的版本中发布。
公司变迁
| 年份 | 事件 |
|---|---|
| 1995 | MySQL AB 创立 |
| 2008 | Sun Microsystems 以约 10 亿美元收购 MySQL AB |
| 2009 | Oracle 以 74 亿美元收购 Sun Microsystems,MySQL 归入 Oracle 旗下 |
| 2009 | Monty Widenius 创建 MariaDB(MySQL 的一个分支),作为对 Oracle 收购的回应 |
MySQL 的两个发行版
MySQL Community Edition(社区版):
- 完全免费,GPL 开源协议
- 包含所有核心功能
- 由社区维护,没有官方技术支持
- 适合个人开发者、中小企业、学习用途
MySQL Enterprise Edition(企业版):
- 商业付费版本,需要购买 License
- 包含额外的企业级工具:
- MySQL Enterprise Backup(热备份工具)
- MySQL Enterprise Monitor(监控和告警)
- MySQL Enterprise Firewall(SQL 注入防护)
- MySQL Enterprise Audit(审计日志)
- MySQL Enterprise Transparent Data Encryption(透明数据加密)
- 提供 24x7 官方技术支持
- 适合对稳定性、安全性有高要求的企业
DBA 的得力工具:MySQL Enterprise Monitor 可以实时监控数据库性能、自动检测异常、生成优化建议,相当于给数据库配了一个"健康管家"。但价格不菲,通常年薪百万的 DBA 所在的公司才用得起。
1.5 MySQL 架构概览
MySQL 采用三层架构,理解这三个层次有助于你之后学习查询优化、存储引擎选择等高级主题。
┌─────────────────────────────────────────────┐
│ 连接层 (Connection Layer) │
│ 连接管理、身份认证、线程池 │
├─────────────────────────────────────────────┤
│ SQL 层 (SQL Layer) │
│ 查询缓存(8.0已移除)→ 解析 → 预处理 │
│ → 优化 → 执行 │
│ 包括:权限检查、存储过程、触发器、视图等 │
├─────────────────────────────────────────────┤
│ 存储引擎层 (Storage Engine Layer) │
│ InnoDB / MyISAM / MEMORY / ARCHIVE / CSV │
│ 负责数据在磁盘上的物理存储 │
└─────────────────────────────────────────────┘连接层
当客户端(命令行、Workbench、应用程序)连接 MySQL 时,首先接触的就是连接层。
主要职责:
- 连接管理:接收 TCP/IP 或 Unix Socket 连接
- 身份认证:验证用户名、密码、连接来源主机
- 线程分配:为每个连接分配一个线程(连接数过多会消耗大量内存)
-- 查看当前连接数和最大连接数
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';SQL 层
SQL 层是 MySQL 的大脑,负责理解并执行 SQL 语句。一条 SELECT 语句进入 SQL 层后经历的流程:
SQL语句 → 词法分析 → 语法分析 → 预处理 → 查询优化 → 生成执行计划 → 调用存储引擎API → 返回结果关键环节解释:
- 分析器(Parser):将 SQL 文本解析成"解析树"。如果你写了
SELECT * FORM user(FORM 拼写错误),这一层就会报语法错误 - 预处理器(Preprocessor):检查表和列是否存在,检查用户权限
- 优化器(Optimizer):这是 SQL 层最复杂的部分。同一个查询可能有多种执行方式,优化器负责选择"代价最小"的执行计划。例如,决定使用哪个索引、JOIN 的顺序等。后续章节中的 EXPLAIN 命令就是用来查看优化器生成的执行计划
- 执行器(Executor):根据优化器的执行计划,调用存储引擎的 API 来实际读写数据
关键认知:SQL 是一种"声明式"语言——你告诉数据库"我要什么",而不是"怎么做"。优化器就是那个决定"怎么做"的幕后功臣,也是后续性能调优的重点关注对象。
存储引擎层
存储引擎是 MySQL 区别于其他数据库的重要特性。它是可插拔的(Pluggable)——你可以在不重启数据库的情况下切换表的存储引擎。
存储引擎负责数据的实际存储和读取。不同的存储引擎有不同的特性:
-- 查看当前 MySQL 支持哪些存储引擎
SHOW ENGINES;
-- 查看某张表使用的存储引擎
SHOW TABLE STATUS LIKE 'table_name';1.6 常用存储引擎对比
InnoDB vs MyISAM
| 特性 | InnoDB(✅ 推荐) | MyISAM(❌ 逐渐淘汰) |
|---|---|---|
| 事务支持 | ✅ 完整 ACID 事务 | ❌ 不支持事务 |
| 行级锁 | ✅ 行级锁(高并发) | ❌ 表级锁(并发差) |
| 外键 | ✅ 支持 | ❌ 不支持 |
| 崩溃恢复 | ✅ 自动崩溃恢复 | ❌ 崩溃后可能损坏,需手动修复 |
| 全文索引 | ✅ MySQL 5.6+ 支持 | ✅ 原生支持 |
| 存储限制 | 64TB / 表 | 256TB / 表(取决于 OS) |
| 数据存储 | 表空间(共享或独立) | 每个表 3 个文件(.frm/.MYD/.MYI) |
| 计数性能 | SELECT COUNT(*) 需扫描索引 | SELECT COUNT(*) 直接从元数据读取,很快(但没有 WHERE 条件时) |
| 压缩 | 支持页压缩 | 支持静态表压缩 |
| 默认引擎 | MySQL 5.5+ 默认 | MySQL 5.5 之前默认 |
| 适用场景 | 绝大多数 OLTP 应用 | 只读或极少更新的归档数据 |
InnoDB 为什么是默认选择
- 事务支持:转账、下单等操作需要事务保证数据一致性
- 行级锁:高并发场景下,不同事务可以同时修改不同行,不会互相阻塞
- 外键约束:在数据库层面保证引用完整性(尽管很多架构倾向于在应用层控制)
- 崩溃恢复:InnoDB 有 redo log,即使在写数据时断电,重启后也能自动恢复
- MVCC:多版本并发控制,读不阻塞写,写不阻塞读
其他存储引擎简介
| 引擎 | 特点 | 使用场景 |
|---|---|---|
| MEMORY | 数据全在内存中,重启数据丢失 | 临时表、缓存表 |
| ARCHIVE | 高压缩比,只支持 INSERT 和 SELECT | 归档日志数据 |
| CSV | 以 CSV 文件格式存储 | 与外部工具的简单数据交换 |
| BLACKHOLE | 吞掉所有写入,不存储数据 | 主从复制的中间节点 |
| FEDERATED | 访问远程 MySQL 表如同本地表 | 分布式数据库架构(不常用) |
1.7 MySQL 在真实世界中的应用
MySQL 是全球最流行的开源数据库,被广泛应用于各类系统中。以下是一些典型的使用场景:
Web 应用后端
MySQL 是 LAMP(Linux + Apache + MySQL + PHP)技术栈的核心组成部分。全球超过 80% 的网站使用这个组合或其变体。
- Facebook:历史上使用 MySQL 作为主要数据存储,拥有数千台 MySQL 服务器,并为此贡献了大量优化和工具
- YouTube:视频元数据、用户信息全部在 MySQL 中
- Wikipedia:全球第五大网站的百科全书内容存储在 MySQL 中
- Twitter:早期大量使用 MySQL,后逐渐加入其他数据存储
电商系统
中国的电商巨头普遍使用 MySQL(淘宝/天猫已经迁移到自研的 AliSQL 和 OceanBase,但它们最初都是从 MySQL 架构演化而来)。
典型用法:用户信息(MySQL) + 商品数据(MySQL) + 缓存(Redis) + 搜索(Elasticsearch)
金融系统
在金融领域,虽然 Oracle 更为主流(核心交易系统),但 MySQL 在以下场景广泛使用:
- 对账系统(批量数据处理,InnoDB 事务保证准确性)
- 风控系统(实时查询、高频更新)
- 报表系统(MySQL + BI 工具)
游戏行业
- 玩家信息存储(账号、角色、装备、货币)
- 排行榜(MySQL ORDER BY + LIMIT 或结合 Redis Sorted Set)
- 日志分析
日志和监控
配合 ELK 或自有监控系统,MySQL 用于存储监控指标、告警历史等结构化日志数据。
云数据库
几乎所有云服务商都提供了基于 MySQL 的托管服务:
- AWS:Amazon RDS for MySQL、Amazon Aurora(MySQL 兼容)
- 阿里云:云数据库 RDS MySQL 版、PolarDB for MySQL
- 腾讯云:云数据库 MySQL
- Google Cloud:Cloud SQL for MySQL
常见错误
错误 1:把 MySQL 当成"数据库"而不是 "DBMS"
现象:初学者常说"我安装了一个数据库",实际上安装的是 MySQL 这个数据库管理系统。在 MySQL 里可以创建很多个数据库。
原因:中文语境下,"数据库"这个词使用宽松,导致了概念混淆。
正确理解:MySQL = DBMS(管理工具),你在 MySQL 里 CREATE DATABASE mydb; 创建的 mydb 才是数据库。
错误 2:认为 NoSQL 会取代关系型数据库
现象:在 NoSQL 热潮时期(2010 年前后),很多文章宣称"关系型数据库已死"。
原因:对 NoSQL 优势的过度夸大。NoSQL 在特定场景下很有优势(如海量日志、社交关系图),但它缺乏 ACID 事务、JOIN 等关键能力。
正确理解:关系型数据库和 NoSQL 不是替代关系,而是互补关系。大多数公司的技术栈是"关系型数据库 + Redis + 搜索引擎"的组合。核心交易数据永远应该在关系型数据库中。
错误 3:SQL 分类不清
现象:把 SELECT 和 INSERT 当成同一类,或者不知道 GRANT 属于什么。
原因:刚接触数据库时,所有语句都混在一起学,没有有意识地分类。
正确理解:
- 有没有动数据?没有 → DQL(SELECT)
- 有没有改数据行?有 → DML(INSERT/UPDATE/DELETE)
- 有没有改表结构?有 → DDL(CREATE/ALTER/DROP)
- 是不是权限相关?→ DCL(GRANT/REVOKE)
- 是不是事务相关?→ TCL(COMMIT/ROLLBACK)
错误 4:没搞清楚 utf8 和 utf8mb4 的区别就开始用
现象:很多人设置 CHARACTER SET utf8,然后发现插入 emoji(如 😀)时报错或变成乱码。
原因:MySQL 的 utf8 是一个"残缺的" UTF-8,只支持最多 3 个字节的字符(即 BMP 基本多文种平面),而 emoji 和部分罕见汉字需要 4 个字节。真正的完整 UTF-8 在 MySQL 中叫 utf8mb4。
正确做法:永远使用 utf8mb4,除非有非常特殊的理由必须用 utf8。后面第4章会详细讲解。
错误 5:认为 MySQL 只有 InnoDB 一种引擎
现象:学了一段时间 MySQL 后仍然不知道还有其他存储引擎,也不知道自己用的到底是什么引擎。
原因:MySQL 5.5 后 InnoDB 是默认引擎,大多数教程也默认使用 InnoDB。但了解其他引擎能帮你应对特殊场景。
正确做法:在做技术选型时,根据业务需求(是否需要事务、是否需要全文索引、是否只读归档等)选择合适的存储引擎。绝大部分情况选 InnoDB 是对的,但知道为什么选它更对。
本章练习
概念辨析:请你用自己的话,用 1-2 句话分别解释以下三个概念:数据、数据库、DBMS。然后举一个生活中的例子说明三者的关系(例如:图书、书架、图书馆管理系统)。
SQL 分类练习:将以下 10 个 SQL 关键词分别归入 DDL、DML、DQL、DCL、TCL 五个类别中:
SELECT、CREATE TABLE、INSERT、GRANT、ROLLBACK、ALTER TABLE、DELETE、REVOKE、DROP DATABASE、COMMITMySQL 版本调研:到 MySQL 官网查看当前最新版本是多少(8.0.x 还是 8.4.x 还是 9.x?)。查阅资料对比 MySQL 5.7 和 MySQL 8.0 在 JSON 支持方面的差异。
存储引擎对比:用表格形式对比 InnoDB 和 MyISAM 的 5 个关键差异(事务、锁、外键、崩溃恢复、全文索引支持情况)。简述如果让你为一个博客系统选存储引擎,你会选哪个?为什么?
真实场景分析:假设你要设计一个"校园二手交易平台"的数据库,列出可能需要存储的 8-10 种数据实体(如用户、商品等)以及它们之间的大致关系。
思考题:为什么在 MySQL 5.5 版本中,Oracle 决定将默认存储引擎从 MyISAM 改为 InnoDB?这一改变反映了数据库行业怎样的发展趋势?