一:数据库是怎么工作的?
1.4.1 数据库服务工作模型
什么是C/S模型?
C/S模型就是客户端/服务端模型,就像你去饭店吃饭:
- 客户端 = 你(点菜的人)
- 服务端 = 厨师(做饭的人)
- Socket(套接字) = 服务员(传递你和厨师之间的信息)
客户端有哪些?
客户端就是“连接数据库的工具”,有三种:
| 类型 | 谁用 | 例子 |
|---|---|---|
| 自带命令行工具 | 管理员 | mysql、mysqladmin、mysqldump |
| 图形化工具 | 开发人员 | SQLyog、Navicat、Workbench |
| 程序连接器 | 程序员写代码用 | pymysql(Python)、gomsql(Go)、php-mysql |
服务端是什么?
服务端就是数据库的“大脑”——mysqld 进程,它负责处理所有客户端的请求。
怎么连接数据库?
有两种方式:
| 连接方式 | 说明 | 例子 |
|---|---|---|
| 本地连接 | 基于unix套接字方式连接,用socket文件,像你在家自己做饭 | Linux本地连接 |
| 远程连接 | 基于TCP/IP协议,像点外卖 | 用IP地址远程连接 |
二:什么是数据库实例?
1.4.2 数据库服务实例构成
实例是什么?
实例 = 正在运行的MySQL程序 + 它占用的内存 + 它做的事。
你可以把它想象成:
一个厨房(实例)= 厨师(mysqld)+ 配菜员(线程)+ 切菜板(内存)
实例的组成:
- mysqld:主程序
- master thread:主线程,监控一切
- 其他线程:IO线程(读写)、SQL线程(执行语句)、Purge线程(清理垃圾)
- 内存结构:用来临时存数据,加快速度
内存结构补充知识:
| 内存区域 | 作用 |
|---|---|
| 内核预留内存 | 保证系统不卡死 |
| RSS常驻内存 | 给线程用的 |
| page cache(页缓存) | 最大的区域,存数据 |
| anon page(匿名页) | 最小区域,存临时数据 |
小贴士:MySQL运行时会占用RSS和page cache,所以内存要留够!
三:MySQL内部是怎么工作的?
1.4.3 数据库服务程序结构
整体结构图(简化版):
客户端 → 连接器 → 查询缓存 → 分析器 → 优化器 → 执行器 → 存储引擎 → 磁盘
每一层的功能(超级通俗版)
1️⃣ 连接器
- 负责“开门查身份”
- 你输入用户名密码,它去mysql.user表里查对不对
- 如果对了,就把你的权限记下来
- 如果你太久不动(默认8小时),它会把你踢出去
长连接:一直连着,省事但占内存
短连接:用完就断,频繁连接慢
2️⃣ 查询缓存
- 把你查过的语句和结果存起来
- 下次查同样的语句,直接返回结果,超快!
- 但不推荐用,因为表一更新,缓存就全清空,白忙活
- MySQL 8.0 直接删了这个功能
3️⃣ 分析器
- 先词法分析:识别关键字、表名、字段名
- 再语法分析:看语句对不对
- 比如你写
elect * from T,它会报错:“s呢?”
4️⃣ 优化器
- 决定“怎么做最快”
- 比如多表查询时,先查哪个表?用哪个索引?
- 它会选一个成本最低的方案
5️⃣ 执行器
- 真正开始干活!
- 先检查你有没有权限
- 然后调用存储引擎的接口,一行一行查数据
- 把结果返回给你
小思考题:
如果表里没有字段k,你写
select * from T where k=1,会在哪个阶段报错?
✅ 答案是:分析器。因为它在分析阶段就会检查字段是否存在。
四:逻辑结构和物理结构
1.4.4 逻辑结构
什么是逻辑结构?
就是你在MySQL里看到的那些“虚拟的东西”:
- 数据库 = 文件夹
- 数据表 = 文件
- 字段 = 表格的列
- 记录 = 表格的行
你不能直接操作磁盘,只能通过这些逻辑结构来操作数据。
1.4.5 物理结构
宏观物理结构
就是硬盘上实际存的东西:
- 数据库 → 对应一个目录
- 数据表 → 对应文件(如
.ibd文件)
微观物理结构(存储引擎内部)
| 名词 | 解释 | 类比 |
|---|---|---|
| 段(segment) | 一个表就是一个段 | 一整栋楼 |
| 区(extent) | 一组连续的页,默认1MB | 一层楼 |
| 页(page) | 最小的I/O单位,默认16KB | 一个房间 |
| 行(row) | 一条数据 | 一个人 |
MySQL读写数据是以“页”为单位的,不是一行一行读的,这样效率高!
📌 和磁盘的关系
- 磁盘有扇区(512字节)
- 操作系统有block(4KB)
- MySQL有page(16KB)= 4个block = 8个扇区
这样设计是为了让读写更连续、更高效!
✅ 总结一句话:
MySQL = 客户端发请求 → 服务端处理请求 → 经过连接器、分析器、优化器、执行器 → 调用存储引擎 → 从磁盘读写数据 → 返回结果。
Comments NOTHING