MySQL中SQL执行过程
2020-12-07 13:49:44 0 举报
讲述了应用服务器与MySQL交互的过程以及存储引擎执行SQL的过程
作者其他创作
大纲/内容
redo日志
基础节点
数据页(16kb)
描述数据
通过执行器调用存储引擎真正执行SQL
存储引擎执行SQL过程
binlog日志
一行数据
磁盘文件
Buffer Pool
热数据区
当从磁盘加载数据到Buffer Pool时,会先从free链表查找空闲的缓存页,如果这时没有空闲的缓存页,则需要通过LRU链表进行最近最少访问的缓存页从Buffer Pool中删除并将数据刷入磁盘,因此MySQL中会有一个LRU链表存储各个缓存页的使用情况防止出现free链表中没有可用缓存页的情况
执行器
7.将变更的bin log文件和位置写入redo日志并写commitid,完成最终的事务提交
2.写入旧数据到undo日志便于回滚
flush链表
MySQL服务器中通过一个哈希表去表示具体的数据页有没有在缓存中,表空间+数据页号作为key,缓存页地址作为value进行存储
分配一个线程去处理SQL
加载磁盘的具体数据到Buffer Pool都是一页一页的进行加载到缓存页
6.写入binlog日志
MySQL连接池
flush链表结构和free链表数据结构一样,用于存储修改过的缓存页对应的描述数据库(即脏数据页),后续刷新数据页同步到磁盘只需刷新flush对应的缓存页(脏数据页)
5.redo log写入磁盘
缓存页
InnoDB存储引擎
通过查询优化器选择最优查询路径
4.写入数据到Redo Log Buffer
通过查询解析器去解析SQL
在Buffer Pool中,每个缓存页都有一块描述数据一一对应
应用程序
冷数据区
通过mysql驱动与数据库建立连接
MySQL服务器
LRU链表为了防止预读加载到缓存页的数据过多导致过快占满缓存,所以将数据分为热数据区和冷数据区,刚加入缓存的数据页在冷数据区,1s后再被访问才会被加入热数据区。因此当需要进行缓存淘汰时,优先淘汰冷数据区尾部的数据就可以了
应用程序与MySQL服务器的交互图
3.更新内存数据
基础节点引用了free链表的头结点和尾节点,还存储了链表中有多少描述数据块
执行SQL语句
undo日志
1.加载缓存数据
Redo Log Buffer
LRU链表
free聊表存的是各个缓存页的描述数据块,只要缓存页是空闲的,那么对应的描述数据块就会加入free链表,各个描述数据块之间形成双向链表结构
free链表
通过SQL接口处理接收的SQL
收藏
收藏
0 条评论
回复 删除
下一页