数据库架构
说说 MySQL 的基础架构
这一块的话可以从用户体验来说起,我们使用的时候往往先是要提示数据库连接,所以第一层肯定是连接层,负责验证用户身份,权限校验之类的
然后我们连好数据库之后,需要的就是发送 sql 语句,接收到 sql 语句之后,就要负责查询解析、优化、执行等操作,这就是服务层需要干的事
服务层是 MySQL 的核心,sql 语句会经过解析,优化器等优化,然后转发到存储引擎执行,并返回结果
服务层的数据从何而来,就是存储引擎
binlog 在服务层,负责记录 SQL 语句的变化。它记录了所有对数据库进行更改的操作,用于数据恢复、主从复制等
一条查询语句是如何执行的
当我们执行一条 SELECT 语句时,并不会直接去磁盘读取数据,而是经过一些步骤后再返回结果
- 客户端发送 SQL 查询语句到 MySQL 服务器
- MySQL 服务器的连接器开始处理这个请求,跟客户端建立连接、获取权限、管理连接。
- 解析器对 SQL 语句进行解析,检查语句是否符合 SQL 语法规则,确保数据库、表和列都是存在的,并处理 SQL 语句中的名称解析和权限验证
- 优化器负责确定 SQL 语句的执行计划,这包括选择使用哪些索引,以及决定表之间的连接顺序等
- 执行器会调用存储引擎的 API 来进行数据的读写
- 存储引擎负责查询数据,并将执行结果返回给客户端。客户端接收到查询结果,完成这次查询请求
一条更新语句是如何执行的
总的来说,一条 UPDATE 语句的执行过程包括读取数据页、加锁解锁、事务提交、日志记录等多个步骤
在事务开始前,MySQL 需要记录 undo log,用于事务回滚。
| 操作 | id | 旧值 | 新值 |
|---|---|---|---|
| update | 2 | N | 1 |
除了记录 undo log,存储引擎还会将更新操作写入 redo log,状态标记为 prepare,并确保 redo log 持久化到磁盘。这一步可以保证即使系统崩溃,数据也能通过 redo log 恢复到一致状态
写完 redo log 后,MySQL 会获取行锁,将 a 的值修改为 1,标记为脏页,此时数据仍然在内存的 buffer pool 中,不会立即写入磁盘。后台线程会在适当的时候将脏页刷盘,以提高性能。
最后提交事务,redo log 中的记录被标记为 committed,行锁释放。