MySQL 原理
2021-06-21 12:31:49 30 举报
MySQL是一种关系型数据库管理系统,它使用结构化查询语言(SQL)来管理数据。MySQL的核心是存储引擎,它负责处理数据的存储和检索。MySQL支持多种存储引擎,如InnoDB、MyISAM、Memory等,每种存储引擎都有其特点和适用场景。MySQL还提供了事务、视图、触发器等高级功能,以满足复杂的业务需求。此外,MySQL还具有高性能、高并发、易用性等特点,使其成为全球最受欢迎的开源数据库之一。
作者其他创作
大纲/内容
节点
读取
查询优化器
4. 写入 redo 日志用于恢复
一行数据
SQL线程
解析 SQL
6.2 刷入磁盘
访问数据
Buffer Pool 在数据库启动时,即分好描述数据 + 缓存页们。通过 free 链表,可以拿到空闲的描述数据,从而拿到缓存页。
IO 线程(后台执行)
写入
Redo Log Pool
内存
OS Cache
MySQL Slave 节点
磁盘文件
SQL 执行流程
缓存页
加载
描述数据:缓存页:数据页 = 1:1:1
flush 链表
8.1 读取脏页
1. 加载数据如果 Buffer Pool 中不存在
1、MySQL 可以有多个 Buffer Pool,提升多线程的并发访问能力。2、每个 Buffer Pool 包含多个 Chunk,每个 Chunk 包含一系列的描述数据 + 缓存页。相同 Buffer Pool 下的 Chunk 共享 free、flush、lru 等链表。这样,可以实现 Buffer Pool 的动态扩容和缩容,只需要调整 Chunk 的数量即可。
执行器
5.2 刷入磁盘
数据页缓存(哈希表)
头节点count = 数量
磁盘
data 数据
提交事务时,根据 sync_binlog 不同,处理不同。② 等于 0 时,写入 binlog 日志文件对应的 os cache。后续,每 1 秒定期将 os chache 刷入 binlog 日志文件。② 等于 1 时,必须写入 binlog 日志文件。
表空间号 + 数据页号 = 缓存页地址
Buffer Pool(默认 128M,可配置)
3. 更新内存中的数据
工作线程
数据页(16KB)
free 链表
redolog日志文件
注意:只有事务提交时,才会写入 binlog
SQL
同步 binlog
InnoDB 引擎
最近被加载的缓存页,会放到 lru 链表头。如果 free 链表空了,不存在空闲的缓存页,则淘汰最不常用的缓存页,将其数据刷到磁盘文件。
7. 写入 binlog 文件与位置标记 commit 成功
注意:只有事务提交时,才会把 Redo Log Pool 中的 redo 日志,写入到磁盘中!!!
分成热链表和冷链表两分布
注意:每次写 SQL 执行时,都会进行写入
lru 链表
执行 SQL 语句
binlog 日志
主从同步
提交事务时,根据 innodb_flush_log_at_trx_commit 不同,处理不同。① 等于 0 时,不写入 redolog 日志文件,只写到 Redo Log Pool 中。② 等于 2 时,写入 redolog 日志文件对应的 os cache。后续,每 1 秒定期将 os chache 刷入 redolog 日志文件。③ 等于 1 时,必须写入 redolog 日志文件。
哪条数据,做了什么修改
SQL 解析器
undolog日志文件
注意:以 redolog 日志文件的 commit 标记为事务提交的标准,这样两者才能达到一致性。也就是说,即使写入 binlog 日志文件成功,结果 redolog 日志文件处于 prepare 状态,事务也认为成功。
binlog日志文件
flush 链表,每个节点指向脏页(数据被修改的缓存页)对应的描述数据。
reply 日志
8.2 写入磁盘(随机写入)
SQL 写入流程
Buffer Pool缓冲池
包含多个
Buffer Pool 结构
5.1 写入日志
MySQL Master 节点
...
IO 线程
描述数据
6.1 写入日志
存储引擎
执行计划
2. 写入数据的旧值便于回滚
查找最优执行计划
0 条评论
回复 删除
下一页