前言


本篇文章分析SQL语句在MySQL中的执行流程,包括SQL的查询在MySQL内部会怎么流转,SQL语句的更新是怎么完成的。在分析之前我们一起看看MySQL的基础架构,知道了 MySQL由那些组件组成以及这些组件的作用是什么,可以帮助我们理解和解决这些问题。

MySQL架构分析


下面是MySQL的一个简要架构图:

MySQL主要分为Server层和存储引擎层


Server层

主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块binglog日志模块。

存储引擎

主要负责数据的存储和读取,采用可以替换的插件式架构,支持InnoDB、MyISAM、Memory等多个存储引擎,其中InnoDB引擎有自有的日志模块redolog 模块,InnoDB 5.5.5版本作为默认引擎。

连接器

主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。


查询缓存

连接建立后,执行查询语句的时候,会先查询缓存,MySQL会先校验这个SQL是否执行过,以Key-Value的形式缓存在内存中,Key是查询预计,Value是结果集。如果缓存key被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。当然在真正执行缓存查询的时候还是会校验用户的权限,是否有该表的查询条件。

MySQL查询不建议使用缓存,因为对于经常更新的数据来说,缓存的有效时间太短了,往往带来的效果并不好,对于不经常更新的数据来说,使用缓存还是可以的,MySQL 8.0版本后删除了缓存的功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。


分析器

MySQL没有命中缓存,那么就会进入分析器,分析器主要是用来分析SQL语句是来干嘛的,分析器也会分为几步:

第一步,词法分析,一条SQL语句有多个字符串组成,首先要提取关键字,比如select,提出查询的表,提出字段名,提出查询条件等。

第二步,语法分析,主要是判断你输入的SQL是否正确,是否符合MySQL的语法。

完成这2步之后,MySQL就准备开始执行,但是如何执行,怎么执行是最好的结果呢?这个时候就需要优化器上场了。


优化器

优化器的作用就是它认为的最优的执行方案去执行(虽然有时候也不是最优),比如多个索引的时候该如何选择索引,多表查询的时候如何选择关联顺序等。


执行器

当选择了执行方案后,MySQL就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。

语句分析


查询语句

说了以上这么多,那么究竟一条SQL语句是如何执行的呢?其实我们的sql可以分为两种,一种是查询,一种是更新(增加,更新,删除)。我们先分析下查询语句,语句如下:

select * from tb_student  A where A.age='18' and A.name='张三';

结合上面的说明,我们分析下这个语句的执行流程:

  • 先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在MySQL 8.0版本以前,会先查询缓存,以这条SQL语句为key在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。

  • 通过分析器进行词法分析,提取SQL语句的关键元素,比如提取上面这个语句是查询select,提取需要查询的表名为tb_student,需要查询所有的列,查询条件是这个表的id='1'。然后判断这个SQL语句是否有语法错误,比如关键词是否正确等,如果检查没问题就执行下一步。

  • 接下来就是优化器进行确定执行方案,上面的SQL语句,可以有两种执行方案:

     a.先查询学生表中姓名为“张三”的学生,然后判断是否年龄是18。 b.先找出学生中年龄18岁的学生,然后再查询姓名为“张三”的学生。

复制代码

  • 那么优化器根据自己的优化算法进行选择执行效率最好的一个方案(优化器认为,有时候不一定最好)。那么确认了执行计划后就准备开始执行了。

  • 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。

更新语句

以上就是一条查询SQL的执行流程,那么接下来我们看看一条更新语句如何执行的呢?SQL语句如下:

update tb_student A set A.age='19' where A.name='张三';

我们来给张三修改下年龄,在实际数据库肯定不会设置年龄这个字段的,不然要被技术负责人打的。其实条语句也基本上会沿着上一个查询的流程走,只不过执行更新的时候肯定要记录日志啦,这就会引入日志模块了,MySQL自带的日志模块式binlog(归档日志),所有的存储引擎都可以使用,我们常用的InnoDB引擎还自带了一个日志模块redo log,我们就以InnoDB模式下来探讨这个语句的执行流程。流程如下:

  • 先查询到张三这一条数据,如果有缓存,也是会用到缓存。

  • 然后拿到查询的语句,把 age 改为19,然后调用引擎API接口,写入这一行数据,InnoDB引擎把数据保存在内存中,同时记录redo log,此时redo log进入prepare状态,然后告诉执行器,执行完成了,随时可以提交。

  • 执行器收到通知后记录binlog,然后调用引擎接口,提交redo log 为提交状态。

  • 更新完成。

这里肯定有人会问,为什么要用两个日志模块,用一个日志模块不行吗?这就是之前MySQL的模式了,MyISAM引擎是没有redo log的,那么我们知道它是不支持事务的,所以并不是说只用一个日志模块不可以,只是InnoDB引擎就是通过redo log来支持事务的。那么,又会有同学问,我用两个日志模块,但是不要这么复杂行不行,为什么redo log要引入prepare预提交状态?这里我们用反证法来说明下为什么要这么做?

  • 先写redo log直接提交,然后写binlog,假设写完redo log后,机器挂了,binlog日志没有被写入,那么机器重启后,这台机器会通过redo log恢复数据,但是这个时候bingog并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。

  • 先写binlog,然后写redo log,假设写完了binlog,机器异常重启了,由于没有redo log,本机是无法恢复这一条记录的,但是binlog又有记录,那么和上面同样的道理,就会产生数据不一致的情况。

如果采用redo log两阶段提交的方式就不一样了,写完binglog后,然后再提交redo log就会防止出现上述的问题,从而保证了数据的一致性。那么问题来了,有没有一个极端的情况呢?假设redo log 处于预提交状态,binglog也已经写完了,这个时候发生了异常重启会怎么样呢? 这个就要依赖于MySQL的处理机制了,MySQL的处理过程如下:

  • 判断redo log是否完整,如果判断是完整的,就立即提交。

  • 如果redo log只是预提交但不是commit状态,这个时候就会去判断binlog是否完整,如果完整就提交redo log,不完整就回滚事务。

这样就解决了数据一致性的问题。

总结


  • MySQL主要分为Server层和引擎层,Server层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用。

  • 引擎层是插件式的,目前主要包括,MyISAM、InnoDB、Memory等。

  • 查询语句的执行流程如下:权限校验(如果命中缓存)→查询缓存→分析器→优化器→权限校验→执行器→引擎

  • 更新语句执行流程如下:分析器→权限校验→执行器→引擎→redo log(prepare 状态)→binlog→redo log(commit状态)

参考


  • 《mysql专栏45讲》

  • MySQL 5.6参考手册

原文:https://juejin.im/post/5c91b5d7e51d456f957ebd10


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

ENMOBK,《Oracle性能优化与诊断案例》

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

产品推荐

云和恩墨Bethune Pro企业版,集监控、巡检、安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!

云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。

产品咨询:marketing@enmotech.com

解析MySQL基础架构及一条SQL语句的执行流程和流转相关推荐

  1. mysql基础架构(一条update语句如何执行)

    update语句如何执行? 一.流程分析 二.重要的日志模块 1.redo log 2.binlog 3.两阶段提交 三.小结 一.流程分析 与查询流程不一样的是,更新流程涉及,两个重要的日志模块,r ...

  2. 基础架构:一条sql语句是如何执行的?

    一条sql语句是如何执行的? 一条sql语句是如何执行的? 接下来我打算更新一本mysql基础架构专栏,此文章来自与林晓斌老师的极客时间收费栏目,现免费分享给大家 这是专栏的第一篇文章,我想来跟你聊聊 ...

  3. Mysql(一)一条查询语句的执行流程

    MySQL 的内部模块简介 1. Connector:用来支持各种语言和 SQL 的交互,比如 PHP,Python,Java 的JDBC: 2. Management Serveices & ...

  4. MySQL基础架构:一条SQL“查询语句”是如何执行的

    0. MySQL的基础架构图: (图片来自极客时间:https://time.geekbang.org/column/article/68319) 大体来说,MySQL可以分为Server层(服务器层 ...

  5. MySQL的基础架构以及一条查询sql语句的执行流程

    详细介绍了Mysql的基础架构以及一条查询sql的执行流程. 如果不想作为一个只能简单的写写sql工程师,而是想要深入的学习MySQL,那么我们有必要首先从宏观的角度来了解MySQL的整体架构,只有把 ...

  6. 讲mysql执行流程书籍_MySQL 基础架构 1. 一条SQL查询语句的执行过程(个人学习笔记)...

    MySQL的逻辑架构图: MySQL 大体分为 "server 层" 和 "存储引擎层" 两部分: Server 层 包括 连接器.查询缓存.分析器.优化器.执 ...

  7. mybatisplus执行sql语句_[MySQL]sql语句的执行流程

    此篇极客时间专栏<MySQL实战45讲>笔记,文中部分图文来自该专栏. MySQL的执行流程示意图: 大体来说,MySQL可以分为Server层和存储引擎层两部分. Server层包括连接 ...

  8. 执行计划 分析一条sql语句的效率 mysql_MySQL中一条SQL语句的执行过程

    MySQL中一条SQL语句的执行过程 发布时间:2018-11-24 18:35, 浏览次数:390 , 标签: MySQL SQL 查询语句的执行顺序: 1.客户端通过TCP连接发送连接请求到mys ...

  9. 01 | 基础架构:一条 SQL 查询语句是如何执行的

    1. MySQL整体架构预览   MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL的各个功能模块中的执行过程.   大体来说,MySQL 可以分为 Server 层和存储 ...

最新文章

  1. tensorflow 使用
  2. 预售┃每个人都应该学习编程,因为它会教你如何思考
  3. VSCode 多开、环境对比
  4. 知识图谱最新权威综述论文解读:开篇部分
  5. Xcode中StaticLibrary和Framework的共同点和区别
  6. su切换到oracle后怎么退出,linux下启动oralce和关闭oracle以及数据库实例化
  7. 动态修改tabs选项卡和datagrid的某些属性值
  8. Flex Builder 不能Profile的另一个原因:不能使用中文用户名
  9. easyui---tree拖拽同步到数据库
  10. android开发学习——day3
  11. python有向图遍历_python – 获取有向图的所有边对. networkx
  12. php微信显示通讯录,微信小程序通讯录功能实现思路分享
  13. Notepad++查看、编辑二进制文件——安装附加组件HexEditor实现
  14. Tampermonkey油猴插件——安装与使用教程
  15. 计算机常用的输出设备有什么作用,常用的多媒体输入输出设备有哪些,主要功能是什么...
  16. iOS应用内付费(In-App Purchase,IAP,内购)实现要点总结
  17. asp.net 鲜花销售系统1058毕业设计
  18. 图模型在反欺诈中的应用
  19. libc and libc++
  20. 舰载光电跟踪与火控系统发展

热门文章

  1. iosid不足以修改问题_寻找合作伙伴的技巧足以与您合作
  2. drupal全部都是节点_如果Drupal是一支乐队,那将是Rush
  3. 平安 开源 数据库 实践_自举开源业务的3个最佳实践
  4. openstack 功能_为什么我们在OpenStack中冻结功能
  5. (8)Node.js 模块介绍
  6. Bootstrap 警告框插件Alert 的事件
  7. python sanic_Sanic框架安装与简单入门示例
  8. ocdma相干非相干_非相干系统是什么意思
  9. android 框架_推荐一个更贴近 android 场景的启动框架 | Anchors
  10. 支付宝手机网站支付(基于Java实现支付宝手机网站支付)