mysql sql语句执行流程
mysql的sql语句执行流程分为 server层和引擎层
server层是所有存储引擎共享的
引擎层是由不同的存储引擎构成的,例如innodb,myisam和memory等
server层
连接器: 客户端和服务端建立连接,对user表进行校验密码权限是否正确,默认长连接时间为8小时
分析器:分析一条sql语句是否合法
优化器: 表里面存在多个索引的时候,判断优先走那个索引,对sql语句进行优化
执行器: 判断这个表有没有对应的权限,如果有就去查询每一行,把符合条件的放入结果集,然后调用表结构对应的执行引擎
binlog日志:记录sql语句的增删改查,用于主从同步,数据库丢失数据的恢复
mysql默认存储引擎是innodb,通过执行器,调用Innodb存储引擎来查询对应的值
innodb存储引擎
比如我们对这个sql语句进行分析
update biao name='张三' where id=1
1. 将磁盘页id=1的数据,放入内存中(buffer pool缓存池)
2. 将当前要修改的数据放入undolog日志文件中,当事务失败回滚的时候,就用这个来回滚
3. 将内存(buffer pool缓存池)的数据进行修改成 张三
4. 将内存(buffer pool缓存池)的数据放入到redolog的缓冲区中
5. 当redolog缓冲区的数据达到一定量的时候,就会准备提交事务,把redolog的数据写入到磁盘中
6. 将server层的binlog日志写入到磁盘,并准备提交事务
7. 当server层的binlog的数据写入成功之后,binlog会给引擎层的redolog发送一个commit的提交标记,来保证数据的一致性
,这时候才提交事务,但是内存(buffer pool 缓存池)的数据 还没有真正写入到磁盘
8. 当事务提交后,mysql会在后台通过一个io线程,来进行随机的刷盘,把内存(buffer pool缓存池)的数据写入到磁盘
redolog和binlog的区别
1.当数据全部丢失的时候,我们可以使用binlog来恢复数据
2.但是如果只有几条数据丢失,那么我们就需要使用redolog来恢复
3.redolog只记录未刷盘的数据,他属于innodb存储引擎层
4.binlog不会关心是未刷盘还是已经刷盘,如果使用binlog来恢复数据,
那么就得全部覆盖一遍,数据会出现重复,属于server层