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.cnf
5.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、数据类型详解、表约束、字符集与排序规则)