mysql中Innodb的结构及sql语句的执行流程

mysql默认的存储引擎是innodb

1、mysql中一条select的执行流程是:

客户端->服务层->存储引擎层

mysql中5.5.5以前是myisam,5.5.5以后默认的存储引擎是innodb,可以支持innodb,myisam,memory,可以创建表的时候通过关键字ENGINE关键字来指定

explain format=json select * from user_innodb -- 可以查看一条sql的执行计划

explain format=json select * from user_innodb  -- 可以看到执行计划的具体信息

2、innodb的总体架构

innodb主要是有一个buffer pool,当服务层调用数据引擎层时,innodb作为搜索引擎,,首先将从磁盘读取的页存放在缓冲池buffer pool中,将执行的数据写入到redolog中和undolog(记录事务发生之前的数据状态发生异常回滚,保证数据的原子性),将进行二阶段提交(2PC),首先将redolog中的状态变为papare,然后将执行的操作写入到binlog,写入成功提交事务,将redolog中的状态变为commit,经过刷脏操作将数据写入到磁盘DBFile中

其中为什么要写入到redolog中不是直接写入到磁盘中,有以下原因:由于写入到redolog时,是顺序I/O,数据按顺序存放,每次写入不用重新寻址,节约寻址时间,直接写入磁盘DBFile,是随机寻址,时间较长,保证了内存数据的安全性,延迟刷盘时间

2.1 redo log 和 binlog 区别:

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是在某个数据页上做了什么修改;binlog 是逻辑日志,记录的是这个语句的原始逻辑。
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。追加写是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志
  4. binlog以事件的形式记录了所有的DDL和DML语句(因为它记录的是操作而不是 数据值,属于逻辑日志),可以用来做主从复制和数据恢复。

2.2 Buffer Pool的LRU(最近最少使用)算法来进行管理的分为两部分,冷热分离

2.3 ChangeBuffer是buffer pool一部分,如果这个数据页不是唯一索引,不存在数据重复的情况,也就不需要从磁盘加载索引页判断数据是不是重复,这种情况可以在缓存中执行,提高insert,update,delete的速度

2.4log buffer 刷盘时机

2.5page页

2.6后台线程

1、master thread负责刷新缓存数据到磁盘并协调调度其它后台进程。 
2、IO thread 分为 insert buffer、log、read、write进程。分别用来处理 insert buffer、重做日志、读写请求的IO回调。
3、purge thread用来回收undo 页。
4、page cleaner thread用来刷新脏页。

3、更新语句的执行流程

3、崩溃恢复时
 在崩溃恢复时,判断事务是否需要提交: 
 1、binlog无记录,redolog无记录: 在redolog写之前crash,恢复操作:回滚事务 
 2、binlog无记录,redolog状态prepare: 在binlog写完之前的crash,恢复操作:回滚事务 
 3、binlog有记录,redolog状态prepare: 在binlog写完提交事务之前的crash,恢复操作:提交事务 
 4、binlog有记录,redolog状态com

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值