🔥keyipatience:个人主页
🎬作者简介:C/C++后端开发学习者
🌟专栏传送门:《c++》《linux》《c++高阶数据结构》《c++数据结构与算法》《前端学习》
《Git》《Mysql》
⭐️patience is key in life
什么是数据库
数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分支。数据库技术主要是用来解决数据处理的非数值计算问题,数据处理的主要内容是数据的存储、查询、修改、排序和统计等。
为什么要使用数据库
1.数据持久化把数据保存在磁盘,程序关掉、服务器重启,数据还在。
对比:内存变量程序一退出就消失。
2.数据结构化以表(行 + 列)的形式存放,有固定字段类型。不像 txt 文件,文本杂乱无章,方便查询管理。
3.数据完整性DBMS 约束保证数据合法。
DBMS 约束
约束是加在表上的规则,DBMS 自动帮你检查数据,不合规则的数据不让插入 / 修改,保证数据是合法、干净的。
常用约束种类
主键、非空、唯一、外键。
4.并发控制很多人同时读写同一份数据,数据库用锁、MVCC 保证不会出现数据错乱。
MVCC(只有 InnoDB 有):
同一条数据,保存多个版本快照,读的时候读旧快照,写的时候新建版本,实现「读写不阻塞」
例子:两个人同时买仅剩 1 件的商品,不会卖出两件。
5.安全性账号密码登录、细粒度权限。比如:某用户只能查询,不能修改;敏感数据可以加密。普通文件没有这套权限体系。
6.可扩展性数据量变大之后可以扩容:
- 垂直扩展:换更强的服务器
- 水平扩展:分库分表,多台机器分担压力
7.备份和恢复支持定时备份,如果误删数据,可以把备份恢复回来,减少损失。
8.查询优化内置查询优化器,自动选择索引、优化执行计划,复杂 SQL 也能高效查询,不用我们自己写代码遍历文件。
9.事务管理((ACID))事务:一组操作,要么全部成功,要么全部失败。
经典例子转账:A 扣钱,B 加钱。如果 A 扣完钱程序崩溃,必须回滚,A 的钱恢复。对应 ACID 特性。
10.多用户支持允许多个用户 / 程序同时连接访问数据库,网站很多用户同时操作就是靠这个。
主流数据库
关系型数据库
- Oracle:甲骨文产品,适合大型项目,业内最强的数据库,没有之一,需要收费。
- MySQL:开源免费,最受欢迎的数据库,在中小企业中普及率非常高,属于甲骨文,主要用在电商,论坛等。
- PostgreSQL:加州大学伯克利分校计算机系开发的关系型数据库,可以免费使用,修改和分发。
- SQL Sever:微软推出的一款专业级数据库,与旗下的操作系统,编程环境配合使用,适用于中大型项目。
- SQLite:一款轻型的数据库,占用资源非常低,常用于嵌入式设备,手机 APP,桌面程序等场景。
非关系型数据库
- Redis:流行的基于键值对的内存数据库,常用作缓存,支持数据持久化,支持多种数据结构。
- MongoDB:基于 NoSQL 的文档型数据库,易扩展,高性能,高可用性,支持丰富的查询和聚合操作。
什么是关系型数据库?
关系型数据库,就是用一张张二维表格存数据,表和表之间能建立联系。表格就是咱们 Excel 那种,横向是行,纵向是列。
- 行(记录):一行代表一条完整信息,比如第一行
1 张三 男 1,就是【张三这个学生】的全部信息。 - 列(字段):一列代表一类信息,比如姓名列、性别列。
- 表之间的关系学生表里有个
班级编号,用这个数字去班级表找对应的班级名字。
张三的班级编号是 1 → 去班级表查到编号 1 是 java113 班。
数据库服务器,数据库与表之间的关系
- mysql:客户端程序(用来发命令、连接数据库)
- mysqld:服务端程序(真正干活、管理磁盘数据、监听 3306 端口的后台进程)
- MySQL 整体是C/S(客户端 / 服务端)架构
层级关系(由大到小):
计算机 → MySQL 数据库服务器 → 多个数据库 (DB) → 每个数据库里有多张表
电脑上装 MySQL 服务;一个 MySQL 能包含很多数据库,一般一个项目建 1 个数据库。;又一个数据库里面可以创建很多张表,表才是保存数据的地方。
eg:
你电脑安装 MySQL(MySQL 服务)
- 这一台 MySQL 里面建 2 个数据库:
shop_db(商城项目)、forum_db(论坛项目)一个项目对应 1 个数据库,两个项目的数据互相分开
打开商城数据库
shop_db,里面新建好几张表:
user用户表(存所有买家账号)goods商品表(存所有商品)orders订单表(存下单记录
对比:
- 数据库(database):是磁盘上按格式存的数据本身(一张张表)
- 数据库服务:就是
mysqld这个进程,负责管理、读写这些数据,对外提供访问
MySQL 架构
整体分为:连接层 → 服务层 → 存储引擎层 → 文件系统层
1.连接层 Connection Pool作用:接待外面的程序(Java/Python/ 命令行) 干的活:验证账号密码,管理连接,控制最多多少人同时连上数据库。
2.服务层(MySQL 核心大脑)收到 SQL 语句后在这里处理:
- 接收 SQL 语句
- 解析器:检查你的 SQL 语法有没有写错
- 优化器:选一条最快的执行方案
- 还有权限、备份、复制这些管理功能
这一层不碰磁盘上真实数据,只负责分析 SQL 要干什么。
3.存储引擎层(可插拔)真正干活读写数据的模块。不同引擎有不同能力,建表时可以自己选。InnoDB 是默认用的引擎。
可插拔:想选哪一个引擎就插哪一个(show engines展示所有引擎)。
服务层下达指令,存储引擎去拿 / 改数据。
4.文件系统层硬盘上真实的文件:数据表、索引、日志、MySQL 配置文件,永久保存在电脑磁盘。
总结:
- 连接层:接待客户端,验证登录
- 服务层:解析、优化 SQL,权限管理
- 存储引擎层:真正读写数据(InnoDB 最重要,可插拔)
- 文件层:磁盘上保存数据、日志文件
SQL分类
1.DDL 数据定义语言管库、表的结构(建表、删表、改表) 命令:create创建,drop删除,alter修改
好比:建一个 Excel 表格、删掉表格、修改表格列
2.DML 数据操纵语言管表格里面的内容(增、删、改里面的行数据) 命令:insert添加数据,delete删除数据,update修改数据
- DQL(属于 DML 里单独拿出来的)数据查询语言命令:
select,专门用来查数据
3.DCL 数据控制语言管权限和事务命令:grant给权限,revoke收回权限,commit提交事务