一、数据库基础概述
1.1 数据与数据库
数据是描述事物的符号记录,是信息的载体;数据库(Database)是长期存储在计算机内、有组织的、可共享的大量数据的集合,具有最小冗余度 、较高数据独立性 和易扩展性等特点。
表格
| 概念 | 核心定义 | 关键特征 |
|---|---|---|
| 数据 | 描述事物的符号记录 | 可存储、可处理、有语义 |
| 数据库 | 有组织的数据集合 | 永久存储、共享访问、低冗余 |
| 数据库管理系统(DBMS) | 管理数据库的系统软件 | 数据定义、操纵、控制、维护 |
| 数据库系统(DBS) | 计算机系统 + DBMS + 数据 + 人员 | 完整的数据库运行环境 |
1.2 数据库技术发展历程
数据库技术经历了从人工管理、文件系统到数据库系统的演变,核心发展阶段如下:
表格
| 发展阶段 | 时间 | 核心特点 | 代表系统 |
|---|---|---|---|
| 人工管理 | 20 世纪 50 年代前 | 无专门管理工具,数据随程序消亡 | 无 |
| 文件系统 | 20 世纪 50-60 年代 | 数据长期存储,但冗余大、独立性差 | 操作系统文件 |
| 层次 / 网状数据库 | 20 世纪 60-70 年代 | 结构化数据管理,支持复杂关系 | IMS、DBTG |
| 关系数据库 | 20 世纪 70 年代至今 | 以关系模型为基础,SQL 为标准语言 | MySQL、Oracle、SQL Server |
| 非关系数据库(NoSQL) | 21 世纪初 | 高并发、高可扩展,适用于大数据场景 | Redis、MongoDB、Elasticsearch |
| 云数据库 | 近年 | 云原生架构,弹性伸缩,按需付费 | AWS RDS、阿里云 RDS |
二、数据模型与数据库设计
2.1 常见数据模型对比
数据模型是对现实世界数据特征的抽象,是数据库系统的核心与基础。
表格
| 模型类型 | 核心结构 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 层次模型 | 树形结构 | 结构清晰、查询效率高 | 多对多关系表达困难、插入删除复杂 | 早期大型机系统 |
| 网状模型 | 网状结构 | 可表达复杂多对多关系 | 结构复杂、编程难度大 | 早期商业系统 |
| 关系模型 | 二维表格 | 结构简单、数据独立性高、SQL 标准化 | 复杂查询性能较弱 | 主流业务系统 |
| 面向对象模型 | 对象与类 | 与面向对象编程天然契合 | 标准化不足、生态不完善 | 特定领域应用 |
2.2 关系模型核心概念
关系模型是当前数据库的主流模型,核心概念如下:
- 关系:对应一张二维表,是实体及联系的抽象
- 元组:表中的一行,代表一个实体实例
- 属性:表中的一列,代表实体的一个特征
- 主键:唯一标识元组的属性或属性组
- 外键:引用其他表主键的属性,用于建立表间关联
2.3 数据库设计三范式
设计关系数据库时,遵循三范式可有效减少数据冗余、保证数据一致性:
- 第一范式(1NF):列不可再分,确保原子性
- 第二范式(2NF):满足 1NF,且非主键属性完全依赖于主键
- 第三范式(3NF):满足 2NF,且非主键属性不传递依赖于主键
三、MySQL 基础与安装配置
3.1 MySQL 简介
MySQL 是开源的关系型数据库管理系统,由瑞典 MySQL AB 公司开发,后被 Oracle 收购。它具有体积小、速度快、成本低、开源等优势,是 Web 开发领域最流行的数据库之一。
3.2 MySQL 安装与配置
3.2.1 安装方式
- 二进制包安装:适合 Linux 系统,灵活可控
- 包管理器安装 :
apt/yum/dnf,便捷高效 - Docker 安装:隔离环境,快速部署
3.2.2 核心配置文件
- Linux :
/etc/my.cnf或/etc/mysql/my.cnf - Windows :
my.ini
关键配置项:
[mysqld]
datadir = /usr/local/mysql/data # 数据存储路径
socket = /usr/local/mysql/data/mysql.sock # 套接字文件
port = 3306 # 监听端口
character-set-server = utf8mb4 # 字符集
collation-server = utf8mb4_unicode_ci
max_connections = 1000 # 最大连接数
3.2.3 服务管理
# 启动MySQL服务
systemctl start mysqld
# 停止服务
systemctl stop mysqld
# 重启服务
systemctl restart mysqld
# 设置开机自启
systemctl enable mysqld
# 查看服务状态
systemctl status mysqld
四、SQL 语言基础
4.1 SQL 分类
SQL(Structured Query Language)是关系数据库的标准语言,按功能分为四类:
表格
| 分类 | 全称 | 核心操作 | 代表命令 |
|---|---|---|---|
| DDL | 数据定义语言 | 定义数据库结构 | CREATE、ALTER、DROP |
| DML | 数据操纵语言 | 操作数据内容 | INSERT、UPDATE、DELETE |
| DQL | 数据查询语言 | 查询数据 | SELECT |
| DCL | 数据控制语言 | 权限管理 | GRANT、REVOKE |
4.2 常用 DDL 操作
4.2.1 数据库操作
-- 创建数据库
CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 查看数据库
SHOW DATABASES;
-- 删除数据库
DROP DATABASE IF EXISTS testdb;
4.2.2 表操作
-- 创建表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码',
email VARCHAR(100) COMMENT '邮箱',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT '用户表';
-- 修改表结构
ALTER TABLE user ADD COLUMN phone VARCHAR(20) COMMENT '手机号';
ALTER TABLE user MODIFY COLUMN email VARCHAR(150) NOT NULL;
ALTER TABLE user DROP COLUMN phone;
-- 删除表
DROP TABLE IF EXISTS user;
4.3 常用 DML 操作
-- 插入数据
INSERT INTO user (username, password, email)
VALUES ('zhangsan', '123456', 'zhangsan@example.com');
-- 更新数据
UPDATE user SET email = 'zhangsan_new@example.com' WHERE id = 1;
-- 删除数据
DELETE FROM user WHERE id = 1;
4.4 核心 DQL 查询
4.4.1 基础查询
-- 查询所有列
SELECT * FROM user;
-- 查询指定列
SELECT id, username FROM user;
-- 条件查询
SELECT * FROM user WHERE create_time > '2024-01-01';
-- 排序
SELECT * FROM user ORDER BY create_time DESC;
-- 分页
SELECT * FROM user LIMIT 10 OFFSET 0;
4.4.2 聚合与分组
-- 统计用户总数
SELECT COUNT(*) FROM user;
-- 按邮箱域名分组统计
SELECT SUBSTRING_INDEX(email, '@', -1) AS domain, COUNT(*)
FROM user
GROUP BY domain
HAVING COUNT(*) > 1;
4.4.3 多表连接
-- 内连接:查询有订单的用户
SELECT u.username, o.order_no
FROM user u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接:查询所有用户及订单(无订单则为NULL)
SELECT u.username, o.order_no
FROM user u
LEFT JOIN orders o ON u.id = o.user_id;
五、MySQL 高级特性
5.1 索引优化
索引是提升查询效率的核心手段,MySQL 支持多种索引类型:
表格
| 索引类型 | 特点 | 适用场景 |
|---|---|---|
| 主键索引 | 唯一且非空,自动创建 | 主键字段 |
| 唯一索引 | 列值唯一,允许 NULL | 唯一约束字段 |
| 普通索引 | 基础索引,无唯一性限制 | 高频查询字段 |
| 复合索引 | 多列组合索引 | 多条件联合查询 |
| 全文索引 | 针对文本内容的高效搜索 | 文章、评论等长文本 |
索引使用原则:
- 避免过度索引,索引会增加写入开销
- 选择区分度高的字段建立索引
- 复合索引遵循最左前缀原则
- 避免在索引列上使用函数或类型转换
5.2 事务与 ACID 特性
事务是一组原子性的 SQL 操作,要么全部执行,要么全部回滚,保证数据一致性。
表格
| ACID 特性 | 定义 | 实现方式 |
|---|---|---|
| 原子性(Atomicity) | 操作不可分割 | Undo 日志 |
| 一致性(Consistency) | 数据从一个一致状态到另一个一致状态 | 事务边界控制 |
| 隔离性(Isolation) | 并发事务互不干扰 | 锁机制 + MVCC |
| 持久性(Durability) | 事务提交后数据永久保存 | Redo 日志 |
事务隔离级别(从低到高):
- 读未提交(Read Uncommitted):可能出现脏读、不可重复读、幻读
- 读已提交(Read Committed):避免脏读,仍可能不可重复读、幻读
- 可重复读(Repeatable Read):MySQL 默认,避免脏读、不可重复读,通过 MVCC 解决幻读
- 串行化(Serializable):最高级别,完全避免并发问题,性能最低
5.3 存储引擎
MySQL 支持多种存储引擎,核心对比:
表格
| 存储引擎 | 事务支持 | 锁粒度 | 适用场景 |
|---|---|---|---|
| InnoDB | 支持 | 行级锁 | 高并发、事务型业务(默认) |
| MyISAM | 不支持 | 表级锁 | 读密集、无事务需求 |
| Memory | 不支持 | 表级锁 | 临时数据、高速缓存 |
| Archive | 不支持 | 行级锁 | 日志、归档数据 |
六、MySQL 运维与安全
6.1 备份与恢复
6.1.1 备份方式
- 逻辑备份 :
mysqldump,导出 SQL 语句,备份文件小、可移植性强 - 物理备份:直接复制数据文件,备份恢复速度快,适合大数据量
- 增量备份:仅备份自上次备份以来变化的数据,节省空间
6.1.2 常用备份命令
# 全库备份
mysqldump -u root -p --all-databases > all_databases.sql
# 单库备份
mysqldump -u root -p testdb > testdb.sql
# 恢复数据
mysql -u root -p testdb < testdb.sql
6.2 性能优化
- SQL 优化 :避免
SELECT *,减少子查询,合理使用索引 - 配置优化 :调整
innodb_buffer_pool_size、max_connections等参数 - 架构优化:读写分离、分库分表、缓存层(Redis)
- 监控分析 :使用
EXPLAIN分析慢查询,开启慢查询日志
6.3 安全管理
- 账号权限最小化 :避免使用
root账号连接应用,按需分配权限 - 密码策略:设置强密码,定期更换
- 网络安全:限制数据库访问 IP,使用 SSL 加密连接
- 数据加密:对敏感数据(如密码)进行加密存储
七、MySQL 实战案例:用户订单系统
7.1 表结构设计
-- 用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码(加密存储)',
phone VARCHAR(20) COMMENT '手机号',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT '用户表';
-- 订单表
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号',
user_id INT NOT NULL COMMENT '用户ID',
total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0-待支付 1-已支付 2-已发货 3-已完成 4-已取消',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (user_id) REFERENCES user(id)
) COMMENT '订单表';
-- 订单商品表
CREATE TABLE order_item (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单项ID',
order_id INT NOT NULL COMMENT '订单ID',
product_name VARCHAR(100) NOT NULL COMMENT '商品名称',
price DECIMAL(10,2) NOT NULL COMMENT '商品单价',
quantity INT NOT NULL DEFAULT 1 COMMENT '购买数量',
FOREIGN KEY (order_id) REFERENCES orders(id)
) COMMENT '订单商品表';
7.2 核心业务查询
-- 查询用户的所有订单及商品明细
SELECT
o.order_no,
o.total_amount,
o.status,
oi.product_name,
oi.price,
oi.quantity
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN order_item oi ON o.id = oi.order_id
WHERE u.username = 'zhangsan'
ORDER BY o.create_time DESC;
八、总结与展望
MySQL 作为开源关系数据库的代表,凭借其高性能、高可靠性和易用性,成为现代 Web 应用的首选数据库。从基础的 SQL 语法到高级的事务、索引优化,再到运维安全与实战案例,本文全面覆盖了 MySQL 核心知识体系