上篇文章:Linux线程池硬核解析:从固定线程池、单例线程池到线程安全、死锁与锁模型|附源码

目录

数据库的本质

MySQL 的本质:mysql 客户端与 mysqld 服务器

数据库服务器、数据库和表的关系

从 Linux 文件系统看数据库的物理本质

MySQL 架构:跨平台外壳下的统一物理体系

SQL 分类:DDL、DML、DQL、DCL

主流数据库对比:为什么 MySQL 这么常见

存储引擎:MySQL 的插件式内核能力

小结:MySQL 是一套运行在操作系统之上的数据管理服务


数据库的本质

数据库不是“高级文件”,而是一套数据管理系统

很多初学者第一次接触 MySQL 时,会把数据库理解成“存数据的地方”。这个理解不能说错,但太浅。文件也能存数据,为什么还需要数据库?核心原因在于:普通文件只提供了“保存字节”的能力,却没有提供足够好的“管理数据”的能力。文件在安全性、查询效率、海量数据组织、并发访问、程序控制、权限管理、结构维护等方面都很弱。数据库的价值不是单纯把数据写到磁盘,而是提供一整套面向数据内容的存储、组织、查询、修改、权限和恢复方案。更准确地说,数据库本质上是:对数据内容进行结构化存储和管理的一套解决方案。

从存储介质看,数据库中的数据最终可以落到磁盘,也可以存在内存中。磁盘适合长期持久化,内存适合高速临时访问。MySQL 之所以重要,是因为它不仅能帮程序员把数据保存下来,还能通过 SQL、索引、事务、权限、存储引擎等机制,让数据可管理、可查询、可恢复、可并发访问。

MySQL 的本质:mysql 客户端与 mysqld 服务器

MySQL 本质上是一种基于 C/S 模式的网络服务。这里的 C 是 Client,S 是 Server。常见的 mysql 命令是客户端程序,mysqld 才是真正的 MySQL 服务端程序。客户端负责接收用户输入的 SQL,把请求发送给服务端;服务端负责解析 SQL、检查权限、选择执行计划、调用存储引擎、读写数据文件,并把结果返回给客户端。

连接 MySQL 服务器常见命令如下:

mysql -h 127.0.0.1 -P 3306 -u root -p

其中 -h 指定主机地址,-P 指定端口,-u 指定用户,-p 表示需要输入密码。如果没有写 -h 127.0.0.1,默认连接本机;如果没有写 -P 3306,默认连接 3306 端口。连接成功后会进入 MySQL Monitor,之后所有 SQL 都会通过客户端发送给服务端执行。

这也解释了一个很重要的问题:用户在命令行里输入 CREATE DATABASE、CREATE TABLE、INSERT 时,真正创建目录、创建文件、写入数据的不是 mysql 客户端,而是后台运行的 mysqld 服务端。

数据库服务器、数据库和表的关系

安装 MySQL 数据库服务器,本质上是在机器上安装了一个数据库管理系统程序。这个管理程序可以管理多个数据库。一般一个应用对应一个数据库,例如博客系统可以有一个 blog 库,电商系统可以有一个 shop 库,用户系统可以有一个 user_center 库。

每个数据库中又可以创建多张表。表用于保存某一类实体的数据,例如学生表、用户表、订单表、商品表。关系可以理解为:

MySQL服务器
  ├── 数据库 helloworld
  │     ├── student 表
  │     └── teacher 表
  └── 数据库 user_db
        ├── user 表
        └── user_profile 表

用 SQL 创建一个数据库和表:

CREATE DATABASE helloworld;
USE helloworld;

CREATE TABLE student(
    id INT,
    name VARCHAR(32),
    gender VARCHAR(2)
);

INSERT INTO student (id, name, gender) VALUES (1, '张三', '男');
INSERT INTO student (id, name, gender) VALUES (2, '李四', '女');
INSERT INTO student (id, name, gender) VALUES (3, '王五', '男');

SELECT * FROM student;

查询结果类似:

+------+--------+--------+
| id   | name   | gender |
+------+--------+--------+
|    1 | 张三   | 男     |
|    2 | 李四   | 女     |
|    3 | 王五   | 男     |
+------+--------+--------+

从逻辑层面看,数据库中有库、表、行、列。从物理层面看,这些结构最终会映射到 Linux 文件系统中的目录和文件。

从 Linux 文件系统看数据库的物理本质

在 Linux 下,MySQL 的数据目录通常位于:

/var/lib/mysql

创建数据库后,可以在该目录下看到对应的数据库目录。例如:

由上图可知,在数据库中建立表,本质上会在 Linux 文件系统中创建对应的数据文件。数据库当然不是简单地让程序员直接读写这些文件,而是由 mysqld 统一管理。用户通过 SQL 描述意图,MySQL 服务端负责把 SQL 转换为对底层文件、内存页、索引结构、日志系统的操作。

因此可以这样理解:

数据库名   -> Linux 下的目录
表         -> 目录中的数据文件或一组文件
SQL 操作   -> mysqld 对底层数据结构和文件的管理动作

数据库并没有脱离操作系统而存在,它最终仍然运行在文件系统、内存、进程、网络、磁盘 IO 之上。MySQL 的强大之处,是在这些基础设施上建立了一套高级的数据管理抽象。

MySQL 架构:跨平台外壳下的统一物理体系

MySQL 是一个可移植数据库,几乎可以运行在 Unix/Linux、Windows、macOS、Solaris 等操作系统上。不同操作系统底层实现不同,例如文件系统、线程模型、IO 模型都有差异,但 MySQL 在整体架构上尽量保持一致。

从宏观上看,MySQL 可以粗略分成几层:连接层负责客户端连接、认证和权限;SQL 层负责 SQL 解析、优化、执行;存储引擎层负责真正的数据存储与索引管理;文件系统和操作系统层负责最终的磁盘、内存、网络和进程调度。

这也是为什么 MySQL 不是一个单纯文件程序,而是一个完整服务端系统。客户端提交 SQL 后,MySQL 要经历解析、权限检查、优化、执行、调用存储引擎、读写数据文件、返回结果等步骤。

SQL 分类:DDL、DML、DQL、DCL

SQL 不是一类命令,而是一组面向不同职责的语言集合。

DDL 是 Data Definition Language,数据定义语言,用来维护数据结构,代表命令有:

CREATE
DROP
ALTER

例如创建数据库、删除表、修改表结构,都属于 DDL。

DML 是 Data Manipulation Language,数据操纵语言,用来操作数据内容,代表命令有:

INSERT
DELETE
UPDATE

例如插入一行数据、删除一条记录、更新用户密码,都属于 DML。

DQL 通常从 DML 中单独划出,表示 Data Query Language,数据查询语言,代表命令是:

SELECT

数据库中最常用、最复杂、优化空间最大的操作通常就是查询。

DCL 是 Data Control Language,数据控制语言,主要负责权限管理和事务控制,代表命令有:

GRANT
REVOKE
COMMIT

主流数据库对比:为什么 MySQL 这么常见

常见数据库包括 SQL Server、Oracle、MySQL、PostgreSQL、SQLite、H2 等。SQL Server 是微软产品,常见于 .NET 技术栈和中大型项目;Oracle 适合大型复杂业务系统,功能强大,商业化程度高;MySQL 是世界上最流行的开源关系型数据库之一,并发能力好,适合电商、SNS、论坛、Web 服务等场景,尤其擅长处理大量简单 SQL;PostgreSQL 功能强大,扩展性优秀,常被认为更“学院派”和更标准;SQLite 是轻量级嵌入式数据库,常用于移动端、嵌入式设备和本地小型存储;H2 是 Java 开发的嵌入式数据库,常用于测试或嵌入式场景。

不同数据库适合不同业务,没有绝对最强,只有场景匹配。MySQL 的优势在于部署简单、生态成熟、并发性能好、Web 开发使用广泛。

存储引擎:MySQL 的插件式内核能力

MySQL 非常重要的设计是插件式存储引擎。存储引擎决定了数据如何存储、索引如何组织、数据如何更新、事务如何支持、锁如何实现。也就是说,MySQL 的 SQL 层可以相对统一,但底层表的数据管理方式可以因存储引擎不同而不同。

查看 MySQL 支持的存储引擎:

SHOW ENGINES;

常见结果中会看到:

InnoDB             DEFAULT   Supports transactions, row-level locking, and foreign keys
MyISAM             YES       MyISAM storage engine
MEMORY             YES       Hash based, stored in memory
CSV                YES       CSV storage engine
ARCHIVE            YES       Archive storage engine
BLACKHOLE          YES       /dev/null storage engine

其中 InnoDB 通常是默认存储引擎。它支持事务、行级锁、外键、崩溃恢复,是现代 MySQL 最核心的引擎。

MyISAM 是早期常见引擎,不支持事务,表级锁,适合某些读多写少的场景。

MEMORY 把数据存在内存中,速度快但数据不持久。

CSV 以 CSV 文件方式存储,适合特殊交换场景。BLACKHOLE 类似 /dev/null,写进去的数据会消失,常用于特殊复制或测试场景。

存储引擎的意义在于:同样是表,不同引擎背后的文件结构、锁模型、事务能力、崩溃恢复能力都可能完全不同。理解 MySQL,不能只停在 SQL 层,还要看到 SQL 背后的存储引擎。

小结:MySQL 是一套运行在操作系统之上的数据管理服务

MySQL 不是神秘黑盒。它本质上是一个 C/S 网络服务,客户端是 mysql,服务端是 mysqld。用户通过 SQL 描述数据操作,服务端负责管理数据库、表、索引、文件、内存和存储引擎。从 Linux 视角看,数据库对应目录,表对应文件或文件集合;从逻辑视角看,数据库由库、表、行、列组成;从内核视角看,MySQL 最终依赖文件系统、磁盘 IO、内存管理、网络连接和进程调度。

理解这一点,后续学习库操作、表操作、字符集、校验规则、备份恢复,就不会只是背命令,而是能真正理解:每一条 SQL 背后,MySQL 到底在系统里做了什么。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐