SQL执行流程
- 连接器
- 客户端连接驱动与mysql连接池连接 半双工通信
- 传入客户端的sql
- 查询缓存(8.0之后没有)
- 删除原因
- 如果每次查询条件不同导致命中率低
- 没有命中缓存 创建新缓存
- 在创建缓存的时候会添加表级锁
- 缓存更新需要批量失效
- 删除原因
- sql解析器
- 对传入的sql
- 词法分析 分解成各种token systembos[]
- 语法分析 bison 语法分析器
- 生成语法树
- 对传入的sql
- sql预处理器
- 提交sql模板语句
- 提交参数执行
- 优化器
- 基于成本的优化器cbo
- 成本指数据表 数据量索引等信息计算的sql语句对应的io消耗指
- 生成可执行的执行计划
- 执行器
- innodb
undo log
首先将bufferpool中数据的旧值写入undo log中以支持回滚
然后将数据写入内存中的buffer pool
redo log
将更新写入信息放入内存中的 redo log buffer
然后将更新写入信息 刷入磁盘中redo log
bin log
变更历史查询 数据库备份恢复 主从复制等功能
在redo log 写入的同时进行binlog的写入操作
刷盘成功后告诉redolog日志 已提交
利用io线程在一些特定时机将内存中需要更新的数据读出同时写入磁盘 open+write函数 idb文件
innodb 主要功能
对执行计划进行微事务拆分
在innodb查询相关的handler api 组合和调用
索引查询 遍历查询 构建临时表等流程
执行后将执行结果返客户端 tcp
- innodb
Kimi 回答
- 首先对我们写的SQL语句进行优化
- 然后将优化后的执行计划传给存储引擎InnoDB
- 事务开始:
- 用户执行一个INSERT、UPDATE或DELETE语句,触发一个事务的开始。
- InnoDB为事务分配一个唯一的事务ID。
- 数据修改:
- 用户的数据修改请求被发送到InnoDB存储引擎。
- InnoDB首先检查要修改的数据页是否在缓冲池中。如果不在,就从磁盘读取到缓冲池。
- InnoDB在缓冲池中的数据页上进行修改。
- Undo日志记录:
- 在修改数据之前,InnoDB将旧数据复制到Undo日志中。
- Undo日志用于支持事务的回滚功能,以便在事务失败或用户执行回滚操作时恢复旧数据。
- Redo日志记录:
- InnoDB将数据的修改信息记录到Redo日志中。
- Redo日志首先写入内存中的Redo日志缓冲区,然后在事务提交时刷新到磁盘上的Redo日志文件。
- Redo日志用于在系统崩溃后恢复未提交的事务。
- 事务提交:
- 用户执行COMMIT语句,请求提交事务。
- InnoDB将Redo日志缓冲区中的数据刷新到磁盘上的Redo日志文件。
- InnoDB确保所有修改过的数据页都被标记为脏页,并将在适当的时候刷新到磁盘。
- 脏页刷新:
- InnoDB后台线程定期将缓冲池中的脏页刷新到磁盘上。
- 脏页刷新是基于一定的策略和算法进行的,以确保数据的一致性和持久性。
- 事务结束:
- 一旦事务提交成功,并且所有相关的数据都被正确地写入到磁盘上,事务就结束了。
- 用户可以继续执行其他事务或查询操作。