一、什么是数据库
很多人会有疑问:直接用文件保存数据就能实现读写,为什么还需要数据库?
那是因为文件保存数据有下面这些缺点:
- 文件的安全性问题。文件本身很难做精细的权限管控,谁拿到文件就能直接读取、修改里面全部内容,很难做到不同用户只能访问指定部分数据。
- 文件不利于数据查询和管理。如果文件里有成千上万条记录,想要按条件检索某一条数据,需要程序从头到尾遍历整个文件,查询效率极低。
- 文件不利于存储海量数据。海量数据放在普通文件里,不仅查找缓慢,扩容、分片管理都非常麻烦。
- 文件在程序中控制不方便。多个程序同时读写同一个文件时,很容易出现数据错乱、覆盖的问题,自己写代码实现并发控制、数据回滚非常复杂。
数据库的存储介质依然是磁盘、内存,并没有脱离底层文件。 为了解决上面这些文件存储的痛点,专家们设计出更加利于管理数据的工具 ------ 数据库,它可以更高效地管理数据。数据库相关能力是衡量一个程序员水平的重要指标。
而我们现在日常开发所说的数据库,一般指按照特定数据结构组织,存放在磁盘或者内存中的数据集合,并且配套了一套完整的管理系统,帮我们处理查询、并发、权限、事务等复杂逻辑。
二、主流数据库
市面上主流使用到的数据库一般都是下面这几种:
SQL Server:微软的产品,.Net 程序员的最爱,中大型项目。
Oracle:甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如 MySQL。
MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的 SQL 处理效果好。
PostgreSQL : 加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。
SQLite:是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统,它包含在一个相对小的 C 库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百 K 的内存就够了。
H2:是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
而我们要学习的是MySQL。

mysqld/mysql:mysql是数据库服务的客户端,而mysqld是数据库服务的服务器端。所以MySQL本质上是一种给予C(mysql)S(mysqld)模式的网络服务!MySQL是一套给我们提供数据存取服务的网络程序!

三、MySQL的基本使用
3.1 MySQL的安装(Ubuntu)
1.更新软件源
bash
sudo apt update
2.安装 mysql 服务端
bash
sudo apt install mysql-server -y
安装完自动启动 mysql,并且开机自启Ubuntu
3.2 连接MySQL服务器
我们可以使用下面的指令来连接MySQL服务器
sql
mysql -h 127.0.0.1 -P 3306 -u root -p
其中,-h表示的是登录部署了mysql服务的主机,-P指明我们要访问的端口号,-u指明登录用户,-p则表示需要输入密码。
3.4 数据库的使用
1.创建数据库
sql
create database data;
输出结果:

2.使用数据库
sql
use data;
输出结果:

3.创建数据库表
sql
create table student(
name varchar(32),
age int,
gender varchar(2)
);
输出结果:

4.展示数据库
sql
show databases;
输出结果:

5.插入数据
sql
insert into student (name, age, gender) values ('张三', 20 , '男');
insert into student (name, age, gender) values ('李四', 21 , '女');
insert into student (name, age, gender) values ('王五', 22 , '男');
输出结果:

建立数据库,本质就是 Linux 下的一个目录。而在数据库内建立表,本质就是在 Linux 下创建对应的文件!
上述的操作都是由用户通过在mysql客户端输入指令,交给mysql服务器,然后服务器为我们用户在磁盘上创建目录与文件。所以我们在修改数据库内容时不能直接在Linux上使用mkdir、touch等指令进行操作,而是要通过mysql进行操作。
3.5 服务器、数据库与表之间的关系
我们常说的安装数据库服务器,本质是在机器上部署一套数据库管理系统(DBMS)。这套管理程序可以同时维护多个独立数据库,开发中通常一个应用对应一个数据库。
数据库用来存放业务数据,为了保存应用里不同实体的信息,我们会在库里面建立多张数据表,用表存储实体数据。
数据库服务器、数据库、数据表三者的层级关系:数据库服务器 > 数据库 > 数据表

而MySQL服务器端为我们创建的数据库DB和表其实就是Linux下的目录和普通文件。
3.6 数据存储的逻辑结构
数据在表中存储是行列式结构,我们可以使用select * from来查看表的内容:

四、MySQL架构
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
MySQL Server 整体采用分层架构,从客户端连接到底层磁盘存储,一共可以简单划分为:连接层 → SQL 层(服务层) → 存储引擎层 → 文件系统层,这张图完整展示了各个模块。

1. Connection Pool 连接池(连接层)
负责处理客户端的连接请求,做连接管理、身份认证、权限安全校验。 客户端(Navicat、Java 程序等)访问 MySQL,首先和这一层建立连接;连接池会复用连接,避免频繁创建销毁连接带来的性能开销。
2. SQL 层(核心服务层)
这一层是 MySQL 的大脑,负责 SQL 的解析、优化、执行,包含下面几个组件:
1、SQL Interface SQL 接口:接收 DML、DDL、存储过程、触发器、视图等各类 SQL 语句,接收用户输入的 SQL。
2、Parser 解析器:包含词法分析、语义分析、语法分析,对 SQL 做语法校验,生成语法树。如果 SQL 写错,语法报错就在这一步抛出。
3、Optimizer 查询优化器:对语法树做 SQL 重写,选择扫描顺序、选择合适索引,生成代价最小的执行计划。我们写的 SQL,不一定会按照我们书写顺序执行,由优化器决定。
4、Caches 查询缓存:全局缓存与引擎专属缓存。如果查询已经缓存,直接返回结果,跳过解析优化流程(MySQL8.0 已经移除了 Query Cache)。
5、Services & utilities 服务与工具组件:提供备份恢复、安全管理、主从复制、集群、分区、Workbench 管理工具等配套功能。
3. Pluggable Storage Engines 可插拔存储引擎层
MySQL 最有特点的设计就是可插拔存储引擎。 SQL 层只负责解析和生成执行计划,不负责数据读写;真正读写数据由存储引擎完成。 图里列出了多种引擎:
InnoDB:MySQL5.5 之后默认引擎,支持事务、行锁、外键、崩溃恢复,生产环境首选。
MyISAM:早期默认引擎,不支持事务,表锁,查询速度快,现在很少用于业务库。
Memory:内存引擎,数据存在内存,重启数据丢失。 还有 Federated、Archive、Merge 等其他引擎,业务极少使用。
要注意的是,在同一个数据库中,不同的表可以使用不同存储引擎。
4. File System 文件系统层
最底层,依托操作系统文件系统(NTFS、ext4、SAN/NAS)持久化数据。 在磁盘上保存各类日志与文件:二进制日志 binlog、错误日志、慢查询日志、通用日志、Redo、Undo、数据文件、索引文件。 所有引擎最终都要把数据落到操作系统文件上。
MySQL完整执行流程如下:
客户端建立连接 → 连接池校验权限 → SQL 接口接收 SQL → 解析器生成语法树 → 优化器生成执行计划 → 交给对应存储引擎读写数据 → 存储引擎操作磁盘文件,最后结果原路返回客户端。
五、SQL分类
1.DDL(数据定义语言)
DDL 用来定义、修改、删除数据库整体结构,不操作表里存储的数据,只负责库、表、字段的框架管理。
常用语句:create、alter、drop、truncate。
当我们需要新建数据库、新建数据表、修改字段类型、删除整张表时,就会使用 DDL 语句执行操作。
2.DML(数据操作语言)
DML 专门针对数据表内部的行数据进行增删改查,不改动表结构,只操作表里存储的业务数据。 常用语句:insert、delete、update、select。
当我们需要往表中新增记录、删除数据、修改已有字段值、查询数据内容时,就会使用 DML 语句执行操作。
3.DCL(数据控制语言)
DCL 用来管理数据库账号、分配访问权限,控制不同用户对库和表的操作权限。
常用语句:grant、revoke。
当我们新建数据库用户、给账号赋予查询 / 修改权限、回收已有账号操作权限时,就会使用 DCL 语句执行操作。
六、存储引擎
存储引擎是数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MySQL的核心是插件式存储引擎,支持多种存储引擎。
我们可以使用下面的语句来查看存储引擎:
sql
show engines;
输出结果如下:

InnoDB(MySQL 默认引擎)
InnoDB 是 MySQL 的默认存储引擎,支持事务、行级锁、外键。 Transactions:YES,XA:YES,Savepoints:YES。 业务开发中绝大多数场景都会选用 InnoDB。它可以保障事务 ACID 特性,发生崩溃后能够安全恢复数据;行锁可以大幅降低并发写操作的锁冲突,支持外键来维护表与表之间的数据参照完整性。
MyISAM
MyISAM 不支持事务,也没有行锁,只使用表级锁,不支持外键。 Transactions:NO,XA:NO,Savepoints:NO。 一旦对一张表执行写操作,会锁住整张表,并发写入性能很差。优势是结构简单,查询速度快。现在一般只用在只读、查询多、几乎不修改数据的场景。
MEMORY
MEMORY 引擎基于哈希表,所有数据全部存放在内存中,不会持久化到磁盘。 Transactions:NO,XA:NO,Savepoints:NO。 数据库重启之后,里面所有数据直接丢失。适合用来存放临时表、临时计算结果,读写速度极快。
ARCHIVE
归档存储引擎,只适合大量归档数据存储。 Transactions:NO,XA:NO,Savepoints:NO。 它只支持插入和查询,不支持修改、删除,会对数据做高压缩,节省磁盘空间,一般用来存放日志类归档数据。
BLACKHOLE
黑洞存储引擎,写入到这个表的所有数据都会直接消失,不会保存任何内容。 Transactions:NO,XA:NO,Savepoints:NO。 它会接收 SQL 语句并且写入 binlog,但是不存储数据,经常用在主从复制的特殊中转场景。
MRG_MYISAM
它是多个结构完全相同的 MyISAM 表的集合,可以把多张 MyISAM 表合并当成一张表来查询。 Transactions:NO,XA:NO,Savepoints:NO。 底层每张子表依旧是 MyISAM,继承 MyISAM 的所有限制,不支持事务。
FEDERATED
本地不存储真实数据,可以远程访问另一台 MySQL 服务器上的表。 当前这个版本 Support 字段为 NO,代表没有启用。 Transactions:NULL,XA:NULL,Savepoints:NULL。 本地只保留表结构定义,查询的时候会去远端数据库拉取数据。
PERFORMANCE_SCHEMA
性能监控相关的引擎,专门用来收集 MySQL 运行时性能指标,不是用来存放业务数据。 Transactions:NO,XA:NO,Savepoints:NO。 我们查询性能相关的监控数据,就是读取这一类表。
CSV
CSV 存储引擎,直接把数据以 CSV 文本格式保存在磁盘文件。 Transactions:NO,XA:NO,Savepoints:NO。 可以直接用文本编辑器打开文件查看内容,但是不支持索引,性能很差,多用于数据导入导出场景。
在这些存储引擎中,只有 InnoDB 支持事务、XA 分布式事务、保存点 savepoints。其余所有引擎都不支持事务。 所以我们在平时开发业务表时,一般选择使用 InnoDB 。