MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
本系列笔记涵盖数据库基础理论、MySQL 安装与使用、SQL 语言、备份恢复、高可用架构及项目实战。第一期聚焦数据库核心概念、关系型数据库理论及 MySQL 入门使用,为后续学习打下坚实基础。
一、数据的分类
在数据获取和使用过程中,根据结构类型可分为三类:
| 类型 | 特点 | 示例 |
|---|---|---|
| 结构化数据 | 用二维表逻辑表达,固定格式和有限长度,先有结构后有数据 | 关系型数据库中的表 |
| 半结构化数据 | 不符合关系型数据模型,但包含标签或标记分隔语义,先有数据后有结构 | JSON、XML、HTML |
| 非结构化数据 | 没有固定结构,无法用二维表表示,整体存储 | 音视频、二进制文件、位置信息 |
结构化数据范例(二维表)
name age 唐三 123 叶凡 456
半结构化数据范例(JSON)
json
[ {"id": 1, "name": "唐三", "age": 123}, {"id": 2, "name": "叶凡", "age": 456} ]
二、数据管理发展历史
| 阶段 | 时间 | 特点 |
|---|---|---|
| 人工管理 | 1950年代中期以前 | 科学计算,磁带/纸带存储,无管理软件,批处理 |
| 文件系统管理 | 1950年代后期~1960年代中期 | 磁盘出现,文件系统管理,长期保存,批处理+联机处理 |
| 数据库系统阶段 | 1960年代后期至今 | 大容量磁盘,DBMS管理,复杂数据模型,高独立性,低冗余 |
文件系统优缺点
- 优点:格式多样,数据长期保存,一定独立性
- 缺点:应用程序对接不便,无并发控制,无安全控制,数据冗余不可避免
三、数据库管理系统(DBMS)
3.1 核心概念
| 术语 | 说明 |
|---|---|
| 数据库(Database) | 长期存储在计算机内的、有组织的、可共享的大量数据集合 |
| DBMS | 操纵和管理数据库的大型软件,如 MySQL、Oracle |
| DBA | 数据库管理员,负责设计、测试、部署、维护数据库 |
| 应用程序 | 通过 DBMS 访问数据库的软件程序 |
3.2 DBMS 特点与基本功能
特点
- 复杂数据模型,数据冗余小,易扩充
- 数据和程序独立(物理独立 + 逻辑独立)
- 统一查询接口
- 并发控制、备份恢复、完整性/安全性保障
基本功能
- 数据定义(DDL)
- 数据操作(DML)
- 数据组织、存储与管理
- 数据库运行管理(并发、事务、恢复)
- 数据库维护(载入、转换、转储、重组)
- 数据库保护(恢复、并发、完整性、安全性)
- 通信(与操作系统、网络软件交互)
3.3 数据库发展分类
- 层次数据库:树状模型,一对多关系(代表:IBM IMS)
- 网状数据库:网络结构,多对多关系
- 关系型数据库(RDBMS):二维表模型,代表:MySQL、Oracle、PostgreSQL、SQL Server
3.4 RDBMS 核心术语
| 术语 | 含义 |
|---|---|
| 数据库 | 表的集合 |
| 表 | 数据的矩阵,行列结构 |
| 列(column) | 相同类型数据的集合 |
| 行(row) | 一条记录(元组) |
| 冗余 | 存储两倍数据,提高安全性但降低性能 |
| 主键(Primary Key) | 唯一标识一行,一个表只能有一个 |
| 外键(Foreign Key) | 关联两个表 |
| 复合键 | 多列组合作为索引键 |
| 索引 | 加速查询,类似书的目录 |
| 参照完整性 | 不允许引用不存在的实体 |
MySQL 表结构示例
ID Name Price Qty 1 白菜 2.00 200 2 土豆 2.60 300 3 青菜 6.00 150
四、关系型数据库理论
4.1 E-R 模型(实体关系模型)
- 实体(Entity):客观存在的事物,用矩形表示
- 属性(Attribute):实体的特性,用椭圆形表示
- 联系(Relationship):实体之间的关联规则,用菱形表示
4.2 联系类型
| 联系类型 | 说明 | 示例 |
|---|---|---|
| 一对一 (1:1) | A 对应一个 B,B 对应一个 A | 人 ↔ 身份证 |
| 一对多 (1:n) | A 对应多个 B,B 只对应一个 A | 班级 → 学生 |
| 多对多 (m:n) | A 对应多个 B,B 对应多个 A | 学生 ↔ 课程 |
表结构示例
sql
-- 学生表(一对一关系的示例) CREATE TABLE student ( stu_id INT PRIMARY KEY, name VARCHAR(20) ); -- 数据:(1, '唐三'), (2, '叶凡') -- 老师表(用于一对多) CREATE TABLE teacher ( teacher_id INT PRIMARY KEY, name VARCHAR(20) ); -- 数据:(1, 'gao'), (2, 'ma') -- 课程表(一对多:一个老师多门课) CREATE TABLE class ( class_id INT PRIMARY KEY, name VARCHAR(20), teacher_id INT ); -- 数据:(1, 'linux',1), (2, 'golang',1), (3, 'python',2), (4, 'java',2) -- 学生与课程多对多关系表(中间表) CREATE TABLE student_class ( class_id INT, stu_id INT ); -- 数据:(1,1), (1,2), (2,1), (3,2)4.3 数据操作(CRUD)
| 操作 | 描述 | SQL 关键字 |
|---|---|---|
| 增加 | 插入数据 | INSERT |
| 读取 | 查询数据 | SELECT |
| 更新 | 修改数据 | UPDATE |
| 删除 | 删除数据 | DELETE |
4.4 数据库规范化(范式)
设计关系数据库时,遵循范式可减少冗余、增进一致性。一般满足第三范式(3NF)即可。
第一范式(1NF):原子性
- 要求:每个字段不可再分(不能是列表、集合或复合结构)
- 反例:联系方式字段存
13800138000, zhang@example.com - 正例:拆分为手机号、邮箱两列
第二范式(2NF):消除部分依赖
- 前提:满足 1NF
- 要求:非主键字段必须完全依赖于整个主键(针对复合主键)
- 反例:订单明细表主键
(订单ID, 商品ID),但“商品名称”只依赖“商品ID” - 解决方法:拆表(商品表 + 订单明细表)
第三范式(3NF):消除传递依赖
- 前提:满足 2NF
- 要求:非主键字段之间不能有依赖关系(如
A→B→C,则 C 传递依赖 A) - 反例:学生表(学生ID → 学院ID → 学院地址)
- 解决方法:拆表(学生表 + 学院表)
范式总结
范式 核心目标 关键规则 1NF 原子性 字段不可再分 2NF 消除部分依赖 非主属性完全依赖整个主键 3NF 消除传递依赖 非主属性之间不能相互依赖
实际开发中,一般满足 3NF 即可,不必追求更高范式。
4.5 SQL 结构化查询语言
SQL(Structured Query Language)用于存取、查询、更新和管理关系数据库。MySQL 采用 C/S 模式,使用专有协议通信。客户端发送 SQL 语句,服务端返回结果。
五、MySQL 安装与基本使用
5.1 MySQL 简介与历史
- 创始人:Michael “Monty” Widenius(女儿名 My,所以叫 MySQL)
- 1995 年发布第一个内部版本,1996 年对外发布 3.11.1
- 2000 年改为 GPL 许可,2001 年集成 InnoDB
- 2008 年被 Sun 收购,2009 年 Oracle 收购 Sun
- 主流分支:官方 MySQL、Percona Server、MariaDB
5.2 MySQL 特性
- 开源,免费
- 标准 SQL 语言
- 跨平台,支持多种语言
- 插件式存储引擎
- 单进程多线程
- 大量测试组件和扩展
5.3 MySQL 多实例
定义:在一台服务器上运行多个 MySQL 服务端进程,每个进程监听不同端口(如 3306、3307、3308),拥有独立配置和数据。
优点
- 节约硬件资源
- 便于对比测试不同版本
- 便于集中管理(安全、备份、启停)
缺点
- 资源抢占
- 单点风险(服务器宕机影响所有实例)
5.4 MySQL 组成和常用工具
服务端主要程序
| 程序 | 功能 |
|---|---|
mysqld_safe | 安全启动脚本 |
mysqld | 核心服务程序 |
mysqld_multi | 多实例管理工具 |
客户端主要程序
| 程序 | 功能 |
|---|---|
mysql | 交互式 CLI 客户端 |
mysqldump | 备份工具 |
mysqladmin | 管理工具 |
mysqlimport | 数据导入工具 |
MyISAM 工具
| 程序 | 功能 |
|---|---|
myisamchk | 检测 MyISAM 表 |
myisampack | 打包 MyISAM 表(只读) |
配置文件
主要配置文件:/etc/my.cnf,以及/etc/my.cnf.d/目录下的文件。
配置文件读取顺序(从mysql --help查看):
text
/etc/my.cnf -> /etc/mysql/my.cnf -> ~/.my.cnf5.5 MySQL 客户端使用
常用选项
bash
mysql [OPTIONS] [database] # 常用选项: -u, --user=name # 用户名 -p, --password[=name] # 密码 -h, --host=host # 服务端主机 -P, --port=port # 端口(默认 3306) -S, --socket=name # socket 文件 -D, --database=db # 指定数据库 -e, --execute=sql # 非交互式执行 SQL 后退出 -H, --html # HTML 格式输出 -X, --xml # XML 格式输出 -t, --table # 表格格式(默认) -E, --vertical # 垂直显示 -v, --verbose # 显示详细信息 --prompt=name # 修改命令提示符使用范例
bash
# 免密登录(注意安全) mysql -uroot -pHuawei@123 # 显示版本 mysql -v # 指定用户名、主机、端口 mysql -uroot -h127.0.0.1 -P3306 # 使用主机名 mysql --user=root --host=localhost --port=3306 # 默认使用 root 空密码登录(仅限测试) mysql # 打印参数列表(不连接) mysql --print-defaults -uroot -hlocalhost --connect-timeout=2 # 以 HTML 格式输出查询结果 mysql -H -e "SELECT VERSION();" # 非交互式执行 SQL 文件 mysql -e "source /root/test.sql" # 或使用重定向 mysql < test.sql # 垂直显示结果 mysql -e "SHOW DATABASES;" -E # 修改命令提示符 mysql --prompt="[\\d]> " # 指定数据库 mysql information_schema客户端常用命令(在 mysql> 提示符下)
| 命令 | 简写 | 功能 |
|---|---|---|
help | ? | 显示帮助 |
clear | \c | 清除当前输入 |
connect | \r | 重新连接 |
delimiter | \d | 设置语句分隔符 |
edit | \e | 使用编辑器编辑命令 |
ego | \G | 垂直显示结果 |
exit/quit | \q | 退出 |
go | \g | 发送命令到服务端 |
source | \. | 执行 SQL 脚本文件 |
status | \s | 获取服务端状态信息 |
system | \! | 执行系统 shell 命令 |
use | \u | 切换数据库 |
tee | \T | 将输出追加到文件 |
notee | \t | 停止输出到文件 |
使用范例
sql
-- 显示当前数据库 mysql> \s -- 切换数据库 mysql> use mysql; -- 调用系统命令 mysql> \! hostname mysql> \! clear -- 修改提示符 mysql> prompt [\\h-\\D]> -- 执行 SQL 脚本 mysql> source /path/to/script.sql mysql> \. /path/to/script.sql -- 开启/关闭输出到文件 mysql> \T /tmp/output.txt mysql> \t -- 设置分隔符为 $(默认 ;) mysql> delimiter $ mysql> SELECT * FROM student$ mysql> delimiter ;mysqladmin 工具(管理工具)
常用命令:
bash
# 显示版本 mysqladmin -V mysqladmin version # 查看状态 mysqladmin status # 设置连接超时 + 静默模式 mysqladmin -h1.2.3.4 --connect-timeout=2 -s ping # 持续执行(每秒 ping 一次,共 3 次) mysqladmin -i 1 -c 3 ping # 关闭服务(不能启动) mysqladmin shutdown # 创建数据库 mysqladmin create db1 # 删除数据库(需确认) mysqladmin drop db1 # 强制删除(无需确认) mysqladmin -f drop db2 # 修改密码(旧密码为空时直接设置) mysqladmin password "123456" # 旧密码存在时 mysqladmin -uroot -p123456 password "abcde"mycli 工具(增强型 MySQL 客户端)
bash
# 安装(依赖 Python) yum install -y python39 pip3 install mycli==1.2.0 # 使用 mycli -uroot -pabcde六、本期知识点一览表
| 知识模块 | 核心要点 |
|---|---|
| 数据分类 | 结构化(二维表)、半结构化(JSON/XML)、非结构化(音视频等) |
| 数据管理发展 | 人工管理 → 文件系统 → 数据库系统 |
| DBMS | 定义、功能(DDL/DML/运行管理/保护/维护)、特点(独立性、低冗余) |
| 关系型数据库 | 二维表模型,主键、外键、索引、参照完整性 |
| E-R 模型 | 实体(矩形)、属性(椭圆)、联系(菱形),三种联系类型(1:1,1:n,m:n) |
| 范式 | 1NF(原子性)、2NF(消除部分依赖)、3NF(消除传递依赖) |
| SQL | 结构化查询语言,用于操作关系数据库 |
| MySQL 历史与特性 | 开源、跨平台、插件式引擎、单进程多线程 |
| MySQL 多实例 | 单机多进程,节省资源但有单点风险 |
| 核心工具 | mysqld, mysql, mysqladmin, mysqldump, mycli |
| 客户端选项 | -u, -p, -h, -P, -e, -H, -E 等 |
| 客户端命令 | \s, \u, !, \T, . , \G, 等 |
| mysqladmin | 管理操作:创建/删除数据库、修改密码、状态监控、关闭服务 |
下一期预告:SQL 语言之库/表操作与数据类型(DDL、数据类型详解、表约束、字符集与排序规则)