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 区别:
- redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
- redo log 是物理日志,记录的是在某个数据页上做了什么修改;binlog 是逻辑日志,记录的是这个语句的原始逻辑。
- redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。追加写是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志
- 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