文章目录

  • 1. SQL语句在mysql的执行过程
    • 一:客户端层
    • 二:mysql服务器层
    • 三:innoDB引擎层
  • 2. undo日志、redo日志、binlog日志的区别?

1. SQL语句在mysql的执行过程

一条更新语句完整流程图如下所示:

步骤:

一:客户端层

id为1的name字段原来的值是zhuge

  • ①:mysql的客户端执行sql
 update t set name = 'zhuge666' where id = 1;

二:mysql服务器层

  • ②: 进入mysql服务器,由连接器验证账号密码等身份信息,验证通过去查mysql缓存,如果有,直接返回。没有进入分析器。
  • ③:进入mysql的分析器,分析sql语句是否符合mysql规范。
  • ④:进入sql优化器,mysql底层优化sql,比如调换索引列等。
  • ⑤:进入执行器,执行sql。

三:innoDB引擎层

mysql服务层后边连接了很多引擎层,如MyIsaminnoDB等,这里只分析innoDB引擎。

以一个update语句为例,看一下inndb是如何执行,并实现底层事务的!

  • ⑥:加载磁盘上id为1的整页数据到 buff pool缓存池中,此时buff pool中的name值为zhuge,为什么加载整页,因为磁盘上存储数据都是整页整页存的。这里要注意:mysql加载数据是整页整页加载的!!
  • ⑦:把buff pool中的 旧值 zhuge 写入undo日志版本链,方便事务提交失败后回滚,回滚时直接从undo日志版本链中取值即可。
  • ⑧:在buff pool中把新的值 zhuge666 赋给 name,注意此时只有buff pool中的name属性做了更新,磁盘上的文件还是原来的旧值 zhuge
  • ⑨:执行器把更新的操作先写入内存中的Redo Log buffer(Redo日志缓冲区)
  • ⑩:把Redo日志缓冲区分批次顺序写入inndb独有的redo磁盘日志文件中,此时准备提交事务
  • ⑪:把更新操作写入binlog日志,内容与redo日志差不多,属于mysql服务层,所有引擎层都有这一步操作。此时还是准备提交事务中,还没提交 。
  • ⑫:写一个commit标记到redo日志中去,该标记为了保证事务提交后,redo日志和binlog日志数据一致。此时才标志着提交事务完成

问题一:binlog为什么要给redo日志中写一个commit标记?

binlog主要用于恢复数据,提交事务时,要给redo日志中写一个commit标记可以保证binlog日志中的数据与redo日志中的数据保持一致性

问题二:磁盘文件的数据什么时候更新?

不确定,有一个后台io线程从Buffer pool缓存池中随机以页为单位写入磁盘。

问题三:如果事务提交后,数据库服务挂了,此时buff pool的数据还没来得及更新到磁盘上,怎么办?

当再次重启服务器时,可以使用redo日志里的数据恢复buff pool中的数据,后台线程再把数据从buff pool中写入磁盘,这也是redo日志的最主要作用

问题四:为什么Mysql不能直接更新磁盘上的数据,而是设置这么一套复杂的机制来执行SQL?

  • ①:内存操作,异步刷盘:如果每个请求都要来更新磁盘,数据库性能将特别差。利用buff poll缓存池在内存中操作数据,定时写入磁盘,大大提高了数据库性能。
  • ②:redo日志顺序写入磁盘redo日志虽然也使用磁盘存储,但相对与直接随机读写磁盘来说,redo日志是顺序写磁盘日志文件的。顺序写入的速度远高于随机写入,同时redo日志还能保证各种异常情况下的数据一致性。

正是通过这套机制,才能让我们的MySQL数据库在较高配置的机器上每秒可以抗下几干的读写请求。

2. undo日志、redo日志、binlog日志的区别?

三种日志都写入磁盘!不过undo日志和redo日志是innoDB存储特有的,binlog日志是所有存储引擎都有的!

  • undo日志:主要用于mvcc机制的实现,还有事务回滚也可直接从undo日志中取到原始值
  • redo日志:主要用于防止mysql宕机时,buff pool中的数据还未来得及写入磁盘,导致数据丢失。使用redo日志可在mysql宕机后再启动时,把数据恢复到buff pool中。第二点就是等待binlog日志发送commit标记后才提交事务,保证与binlog日志文件数据一致!
  • binlog日志:主要用于数据库数据误删恢复,主从复制

mysql执行一条sql语句的完整过程,sql语句在mysql中的执行过程相关推荐

  1. MySQL是如何执行一条SQL更新语句

    MySQL是如何执行一条SQL更新语句 1. SQL更新流程 2. 重做日志redolog 3. 归档日志binlog 4. 两阶段提交 1. SQL更新流程 MySQL是如何执行一条SQL查询语句的 ...

  2. java连接本地数据库命令_Java操作数据库时一次连接只能执行一条SQL命令

    Java操作数据库时一次连接只能执行一条SQL命令 答:× 全面深化改革要攻坚涉险,必须坚持正确的思想方法,不断探索和把握全面深化改革的内在规律,特别是要把握和处理好全面深化改革中的等重大关系 答:整 ...

  3. Java让数据库执行一条sql_java数据库编程——执行SQL 语句

    [0]README [1]java数据库编程--执行SQL 语句相关 1)执行 SQL 命令前, 首先需要创建一个 Statement 对象: 要创建 statement 对象,不需要调用 Drive ...

  4. sql server 2005管理员手册_执行一条sql语句都经历了什么?

    每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...

  5. 拼多多二面:Mybatis是如何执行一条SQL命令的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Mybatis中的Sql命令,在枚举类SqlCommandType ...

  6. oracle一条sql的执行过程,请问执行一条sql的整个过程是怎样的,谢谢!

    select count(*) into c from yaoyao_pbj where object_id=7559; select count(*) into c from yaoyao_pbj ...

  7. mybatis直接执行sql_拼多多二面:Mybatis是如何执行一条SQL命令的?

    Mybatis中的Sql命令,在枚举类SqlCommandType中定义的. public enum SqlCommandType { UNKNOWN, INSERT, UPDATE, DELETE, ...

  8. MySQL的诡异同步问题-重复执行一条relay-log

    MySQL的诡异同步问题 近期遇到一个诡异的MySQL同步问题,经过多方分析和定位后发现居然是由于备份引发的,非常的奇葩,特此记录一下整个问题的分析和定位过程. 现象 同事扩容的一台slave死活追不 ...

  9. php执行一条insert插入两条数据其中一条乱码

    显然这就是编码问题,但是问题从哪来的呢, 我把文件编码以及代码的编码都设置成utf-8了,为什么还有这个问题于是我就开始写测试脚本 第一条 mysql_query('insert into table ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task18. 正则表达式匹配
  2. webpack dev server 和 sublime text 配合时需要注意的地方
  3. 计算机视觉--Python实现人体姿态估计
  4. 3d建模电脑配置要求_学习3D建模需要什么软件,电脑配置应该如何?新手自学会遇到的问题...
  5. 关于 TypeScript 内 constructor signature 的一些失败尝试
  6. python的数据结构包括那些_python算法与数据结构-什么是数据结构
  7. 通才还是专才——由摩托裁员引发的讨论
  8. matlab里用simulink仿真教程,Matlab-Simulink仿真教程
  9. JavaSrcipt学习(学习打卡Day8)
  10. 提高项目10-编制三角函数表
  11. 暴涨狂欢背后,区块链概念股为何难觅龙头?
  12. 计算机等级考试题和答案,全国计算机等级考试试题和答案..doc
  13. 核爆神曲《aLIEz》汉译版
  14. android游戏翻译,百度翻译(Android)v2.5官方版最好的翻译官
  15. 今日头条怎么赚钱?头条号的赚钱思路
  16. 环环相扣的信用卡案情
  17. 陕西省2019计算机软考试题,2019湖北襄阳计算机软考程序员考试真题及答案解析...
  18. 计算机《画图》教案学生状态,《认识画图新朋友》优质课教案
  19. 长宁区区级企业技术中心给予30万元资金支持
  20. Trac 经验谈之(2)杂谈篇补遗

热门文章

  1. Windows和Mac安装JDK及环境变量配置
  2. .net core 后台 post设置等待时间_[vueelementadmin]前端发送的post请求的数据,后端接收不到并报EOFException异常的解决方案...
  3. Maven史上最全总结
  4. luci L大_智慧城市大讲堂 l 大咖说5G智慧大交通
  5. linux 3.10中完成量的使用
  6. 基于SignalR的站点有连接数限制问题及解决方案
  7. AutoIt Windows的自动化脚本
  8. Laravel 5.1 源码阅读
  9. WPF案例 (六) 动态切换UI布局
  10. Java并发编程笔记—基础知识—实用案例