sql的查询语句执行流程、更新语句执行过程

简述查询语句执行流程

举个例子,查询语句如下:
select * from user where id > 1 and name = 'zxb';
  1. 首先检查权限,没有权限则返回错误;
  2. MySQL8.0以前会查询缓存,缓存命中则直接返回,没有则执行下一步;
  3. 词法分析和语法分析。提取表名、查询条件,检查语法是否有错误;
  4. 两种执行方案,先查 id > 1 还是 name = 'wzx' ,优化器根据自己的优化算法选择执行效率最好的方案;
  5. 校验权限,有权限就调用数据库引擎接口,返回引擎的执行结果。

简述更新语句执行过程

举个例子,更新语句如下:

update user set name = 'zxb' where id = 1;
  1. 先查询到 id 1的记录,有缓存会使用缓存。
  2. 拿到查询结果,将 name 更新为wzx,然后调用引擎接口,写入更新数据,innodb 引擎将数据保存在内存(并不会直接更新外存,而是缓存在InnoDB Change Buffe中),同时记录 redolog (确保持久性),此时 redo log 进入 prepare 状态。
  3. 执行器收到通知后记录 binlog ,然后调用引擎接口,提交 redo log commit 状态。
  4. 更新完成。

为什么记录完 redo log ,不直接提交,而是先进入 prepare 状态?

假设先写 redo log 直接提交,然后写 binlog ,写完 redo log 后,机器挂了, binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值