Mysql数据库基础(上)
什么是数据库
一句话:数据库就是有组织地存储和管理数据的系统。
举个生活例子:
像图书馆的“图书目录卡”——每张卡记录一本书的信息(书名、作者、位置),而数据库把这“目录卡”电子化、系统化,还能让多人同时快速查找、增删改。
核心作用:
存:把大量数据安全地存起来
管:防止重复、丢失、错乱
取:随时按条件快速查询、统计、分析
最常见的两类:
关系型(如MySQL):像Excel表格,行列清晰,适合订单、用户账号等。
非关系型(如Redis、MongoDB):更灵活,适合缓存、日志、社交网络等。
一.数据库基本分类
1. 按数据模型分类(最常用)
类型 | 特点 | 代表产品 |
---|---|---|
关系型(RDBMS) | 表格结构,支持SQL,事务强一致性 | MySQL、PostgreSQL、Oracle、SQL Server |
键值型(Key-Value) | 简单键值对,高性能,扩展性强 | Redis、Amazon DynamoDB |
文档型(Document) | 半结构化数据(JSON/BSON),灵活schema | MongoDB、Couchbase |
列族型(Column-Family) | 列式存储,适合大数据和分布式 | Apache Cassandra、HBase |
图数据库(Graph) | 处理复杂关系数据(节点/边) | Neo4j、Amazon Neptune |
2. 按架构/部署方式分类
类型 | 特点 | 代表产品 |
---|---|---|
单机数据库 | 部署简单,适合小规模 | SQLite、MySQL(单机部署) |
分布式数据库 | 支持水平扩展,高可用 | TiDB(NewSQL)、CockroachDB |
云数据库 | 托管服务,弹性伸缩 | Amazon RDS、阿里云PolarDB |
边缘数据库 | 轻量级,适合边缘计算 | SQLite、Dqlite、Rqlite |
3. 按使用场景分类
场景 | 需求特点 | 推荐类型 |
---|---|---|
OLTP(在线事务处理) | 高并发读写,强一致性 | 关系型(MySQL)、NewSQL(TiDB) |
OLAP(在线分析处理) | 复杂查询,批量聚合 | 列式数据库(ClickHouse、Snowflake) |
缓存/会话存储 | 极高速读写,临时数据 | 键值型(Redis) |
IoT/时序数据 | 时间序列,高写入 | InfluxDB、TimescaleDB |
内容管理/日志 | 半结构化数据 | 文档型(MongoDB) |
4. 其他特殊分类
类型 | 说明 | 例子 |
---|---|---|
时序数据库 | 专门优化时间序列数据 | InfluxDB、TimescaleDB |
搜索引擎数据库 | 全文检索,倒排索引 | Elasticsearch、Solr |
多模数据库 | 支持多种数据模型 | MongoDB(文档+图)、ArangoDB |
区块链数据库 | 去中心化,不可篡改 | BigchainDB、Hyperledger Fabric |
🧭 如何选择?
需要复杂事务? → 关系型(如PostgreSQL)
需要高性能缓存? → 键值型(如Redis)
需要灵活Schema? → 文档型(如MongoDB)
需要处理社交网络/推荐? → 图数据库(如Neo4j)
需要分析TB级日志? → 列式OLAP(如ClickHouse)
二.数据库基本操作
一份“从 0 到 1”的 MySQL 四层操作全景手册:
数据库 → 表 → 列 → 行,每一步都给出语法模板 + 典型示例 + 易踩的坑。直接复制即可运行。
0️⃣ 登录 & 全局命令
mysql -u root -p # 登录
SHOW DATABASES; -- 查看所有数据库
SELECT VERSION(); -- 查看版本
1️⃣ 数据库(Database)操作
动作 | 模板 | 示例 | 常见坑 |
---|---|---|---|
创建 | CREATE DATABASE dbname [CHARSET=utf8mb4]; | CREATE DATABASE school CHARSET=utf8mb4; | 忘写字符集会导致中文乱码 |
切换 | USE dbname; | USE school; | 不切换就操作表会报 No database selected |
查看 | SHOW DATABASES; | — | 无 |
删除 | DROP DATABASE dbname; | DROP DATABASE school; | 整库连带所有表瞬间消失,慎用! |
2️⃣ 表(Table)操作
动作 | 模板 | 示例 | 常见坑 |
---|---|---|---|
创建 | CREATE TABLE tbl (col1 类型 约束, col2 …); | CREATE TABLE student(id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, score TINYINT); | 主键/非空约束写错会导致插入失败 |
查看所有表 | SHOW TABLES; | — | 必须先 USE db |
查看表结构 | DESC tbl; 或 SHOW CREATE TABLE tbl\G | DESC student; | \G 纵向显示,字段多时更清晰 |
重命名表 | ALTER TABLE old RENAME TO new; | ALTER TABLE student RENAME TO stu; | 旧表引用会失效 |
删除表 | DROP TABLE tbl; | DROP TABLE student; | 不可逆 |
3️⃣ 列(Column / 字段)操作
动作 | 模板 | 示例 | 备注 |
---|---|---|---|
新增列 | ALTER TABLE tbl ADD COLUMN col 类型 [约束] [FIRST|AFTER 某列]; | ALTER TABLE student ADD COLUMN age TINYINT AFTER name; | 不写 AFTER 默认追加到最后 |
修改列类型/约束 | ALTER TABLE tbl MODIFY COLUMN col 新类型 新约束; | ALTER TABLE student MODIFY COLUMN age SMALLINT NOT NULL; | 会重写整张表,大表耗时长 |
重命名列 | ALTER TABLE tbl CHANGE 旧名 新名 新类型 新约束; | ALTER TABLE student CHANGE score chinese TINYINT; | 新旧名相同也可改类型 |
删除列 | ALTER TABLE tbl DROP COLUMN col; | ALTER TABLE student DROP COLUMN age; | 数据立即丢失 |
4️⃣ 行(Row / 记录)操作
动作 | 模板 | 示例 | 常见坑 |
---|---|---|---|
插入单行 | INSERT INTO tbl(col1,col2,…) VALUES (v1,v2,…); | INSERT INTO student(id,name,chinese) VALUES (1,'张三',95); | 列数/顺序必须一一对应 |
插入多行 | INSERT INTO tbl(col…) VALUES (…),(…),…; | INSERT INTO student VALUES (2,'李四',88),(3,'王五',90); | 一次性提交,效率高 |
查询 | SELECT 列 FROM tbl [WHERE 条件] [ORDER BY …] [LIMIT n]; | SELECT * FROM student WHERE chinese>=90 ORDER BY id DESC LIMIT 2; | 无 WHERE 会全表扫描 |
更新 | UPDATE tbl SET col1=v1,… [WHERE 条件]; | UPDATE student SET chinese=100 WHERE id=2; | 忘写 WHERE 会更新整张表 |
删除行 | DELETE FROM tbl [WHERE 条件]; | DELETE FROM student WHERE id=3; | 忘写 WHERE 会清空表 |
🔍 一张图速查(复制保存)
+-----------------------------+
| 数据库:CREATE/DROP/USE |
+-----------------------------+
| 表:CREATE/DROP/ALTER TABLE |
+-----------------------------+
| 列:ADD/MODIFY/CHANGE/DROP |
+-----------------------------+
| 行:INSERT/SELECT/UPDATE/DELETE |
+-----------------------------+
把这张“四层结构”记牢,90% 的 MySQL 日常需求都能快速定位到对应命令。
三.数据库约束
数据库约束(Constraint)就是给列或表加的“规则”,用来保证数据的完整性和一致性。
MySQL 中常用的 6 大约束,一张表即可秒懂:
表格
复制
约束名 | 关键字 | 作用 | 示例 | 备注 |
---|---|---|---|---|
主键 | PRIMARY KEY | 唯一 + 非空 | id INT PRIMARY KEY | 一张表只能有 1 个 |
唯一 | UNIQUE | 值不能重复,可空 | email VARCHAR(50) UNIQUE | 可多个唯一约束 |
非空 | NOT NULL | 禁止 NULL | name VARCHAR(20) NOT NULL | 最常见 |
默认值 | DEFAULT | 未填时用默认值 | status TINYINT DEFAULT 1 | 省代码 |
外键 | FOREIGN KEY | 跨表引用完整性 | dept_id INT, FOREIGN KEY(dept_id) REFERENCES dept(id) | 支持级联更新/删除 |
检查 | CHECK | 自定义表达式 | age TINYINT CHECK (age BETWEEN 0 AND 150) | MySQL 8.0.16+ 真正生效 |
一、列级写法(最简)
CREATE TABLE user (id INT PRIMARY KEY,email VARCHAR(50) UNIQUE,name VARCHAR(20) NOT NULL,age TINYINT CHECK (age BETWEEN 0 AND 150),status TINYINT DEFAULT 1
);
二、表级写法(复合主键 / 外键推荐)
CREATE TABLE score (stu_id INT,course VARCHAR(20),mark INT,PRIMARY KEY (stu_id, course), -- 复合主键FOREIGN KEY (stu_id) REFERENCES user(id)ON UPDATE CASCADEON DELETE CASCADE
);
三、常见级联动作
ON UPDATE CASCADE
:主表更新,子表同步更新ON DELETE CASCADE
:主表删除,子表对应行一起删ON DELETE SET NULL
:主表删除,子表外键置 NULL(需列允许 NULL)
四、查看与维护
-- 查看表的约束
SELECT * FROM information_schema.table_constraints
WHERE table_schema='school' AND table_name='user';-- 删除约束
ALTER TABLE user DROP PRIMARY KEY; -- 删主键
ALTER TABLE user DROP FOREIGN KEY fk_name; -- 删外键
五、一句话总结
主键唯一、非空必填、默认省写、外键连表、检查把关——五大约束护数据周全。
四.数据库的备份
数据库作为·系统架构的重要组件 同时也是大型公司的重要财产,常常有误删除数据库的状况,这时,备份的数据库就变成了救命稻草,那么,数据库的备份,酒劲是怎么做i到的呢?
MySQL 备份按“能停库”和“不能停库”两大场景,可归纳为 逻辑备份 与 物理备份 两类。下面给出最常用的 4 种方案:命令、示例、优缺点、恢复方法一次讲清,直接复制即可用。
✅ 1. 逻辑备份:mysqldump(官方自带,最常用)
场景 | 命令模板 | 示例 |
---|---|---|
单库 | mysqldump -u用户 -p 库名 > 文件.sql | mysqldump -uroot -p school > school_$(date +%F).sql |
多库 | mysqldump -u用户 -p --databases db1 db2 > all.sql | — |
全库 | mysqldump -u用户 -p --all-databases > full.sql | — |
仅结构 | mysqldump -u用户 -p -d 库名 > schema.sql | -d 表示 no-data |
仅数据 | mysqldump -u用户 -p -t 库名 > data.sql | -t 表示 no-create-info |
🔁 恢复
mysql -u用户 -p 库名 < 文件.sql # 单库
mysql -u用户 -p < full.sql # 全库
⚡ 特点
纯文本 SQL,跨平台、跨版本;
可远程备份;
大数据量时较慢,锁表(MyISAM)或长事务(InnoDB)。
✅ 2. 物理备份:xtrabackup(Percona,热备首选)
动作 | 命令示例 |
---|---|
全量备份 | xtrabackup --user=root --password=xxx --backup --target-dir=/backup/full/2024-06-01 |
增量备份 | xtrabackup --incremental --incremental-basedir=/backup/full/2024-06-01 --target-dir=/backup/inc/2024-06-02 |
准备 | xtrabackup --prepare --target-dir=/backup/full/2024-06-01 |
恢复 | 关闭 MySQL → xtrabackup --copy-back --target-dir=/backup/full/2024-06-01 → 赋权 → 启动 |
⚡ 特点
真正的热备,InnoDB 无需锁表;
支持增量,速度快;
只能恢复到同版本同架构的 MySQL;
社区版需单独安装
percona-xtrabackup
包。
✅ 3. 直接拷贝数据目录(冷备,停机场景)
systemctl stop mysqld # 停库
cp -a /var/lib/mysql /backup/mysql.$(date +%F)
systemctl start mysqld
⚠️ 必须停库,否则数据文件不一致;恢复时直接拷回并赋权。
✅ 4. 快照/云备份(云环境)
云盘快照:阿里云 ECS 云盘、AWS EBS 一键打快照;
RDS 自动备份:控制台设置备份策略,支持按时间点恢复;
逻辑导出到 OSS/S3:
mysqldump
→ OSS/S3 CLI上传。
🚩 如何选择?
场景 | 首选工具 |
---|---|
中小型库,可停库 | mysqldump |
大库,要求不停机 | xtrabackup |
云服务器 | 云盘快照 / RDS 自动备份 |
容器 / 测试环境 | 直接冷拷贝 |
🎯 一句话速记
逻辑备份
mysqldump
万能、物理备份xtrabackup
最快,云环境优先用官方自动备份。