MySQL 学习笔记(第一期):数据库基础与 MySQL 初探

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 特点与基本功能

特点

  • 复杂数据模型,数据冗余小,易扩充
  • 数据和程序独立(物理独立 + 逻辑独立)
  • 统一查询接口
  • 并发控制、备份恢复、完整性/安全性保障

基本功能

  1. 数据定义(DDL)
  2. 数据操作(DML)
  3. 数据组织、存储与管理
  4. 数据库运行管理(并发、事务、恢复)
  5. 数据库维护(载入、转换、转储、重组)
  6. 数据库保护(恢复、并发、完整性、安全性)
  7. 通信(与操作系统、网络软件交互)

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

相关推荐
Peace1 小时前
【Prometheus】
linux·运维·prometheus
数据库小学妹1 小时前
MySQL ORDER BY 深度解析:Using temporary 与 Using filesort 的底层机制及索引优化实战
数据库·经验分享·mysql·性能优化·dba
可乐ea2 小时前
【知识获取与分享社区项目 | 项目日记第 21 天】索引构建与联想建议:Outbox 增量更新 + Completion Suggester
java·大数据·mysql·elasticsearch·搜索引擎
RainCity2 小时前
Java Swing 自定义组件库分享(十一)
java·笔记·后端
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
try2find2 小时前
Agent学习之补充my_plan_solve_agent
学习
bbaydnog2 小时前
FreeRTOS学习笔记 18:调试方法论——HardFault排查、栈溢出检测、运行时统计,RTOS调试三板斧
笔记·单片机·freertos
WPF工业上位机2 小时前
YXGK.FakeVM数据库示例
jvm·数据库·oracle
牛奔2 小时前
如何让 GORM 打印 SQL 语句?三种方式全解析
数据库·sql