一篇文章弄懂MySQL查询语句的执行过程


Posted in MySQL onMay 07, 2021

前言

需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX  这样的SQL,那么当我们向数据库发送这样一个请求时,数据库到底做了什么?

我们今天以MYSQL为例,揭示一下MySQL数据库的查询过程,并让大家对数据库里的一些零件有所了解。

MYSQL架构

一篇文章弄懂MySQL查询语句的执行过程

mysql架构

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

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

存储引擎层 负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB(支持事务),它从 MySQL5.5.5 版本开始成为默认存储引擎。

连接器

连接器主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作。

如果用户密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。

查询缓存( Query cache)

客户端与服务端建立连接后,MySQL 在执行查询语句时会先查询缓存,校验这条SQL是不是在之前执行过。之前执行过的语句及其结果会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个value 就会被直接返回给客户端。如果没有命中,则需要执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。

看到这里大家会不会眼前一亮,会不会有这个功能很好要好好利用的冲动。

其实这里并不建议使用查询缓存,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非是那种很长时间不会更新的表,比如系统配置表,但是这种系统配置我们放在配置平台不好吗?

在MYSQL8.0中已经删除了查询缓存这个功能,官方也是认为该功能在实际的应用场景比较少,所以干脆直接删掉了。

分析器

Mysql没有命中查询缓存,那么就会进入分析器,分析器主要是用来分析SQL语句是来干嘛的。分析器主要分为以下两步:

  • 词法分析 :一条SQL语句有多个字符串组成,首先要提取关键字,比如select,提出查询的表,提出字段名,提出查询条件等等。
  • 语法分析:根据词法分析的结果,语法分析主要就是判断你输入的SQL语句是否正确,是否符合MYSQL语法,如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。

词法分析程序将整个查询语句分解成各类标志,语法分析根据定义的系统语言将“各类标志”转为对MySQL有意义的组合。最后系统生成一个语法树(AST),语法树便是优化器依赖的数据结构。

优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。

为什么需要优化器?

  • 优化器中包含了许多复杂的优化技术,这些优化技术往往比最好的程序员掌握的还要多。系统的自动优化相当于使得所有人都拥有这些优化技术。
  • 优化器可以从数据字典中获取许多统计信息,例如表中的行数、表中的每个列的分布情况等。优化器优化器可以考虑百种不同的执行计划,而程序员一般只能考虑有限的几种可能;
  • 可以根据这些信息选择有效的执行计划,而用户程序则难以获得这些信息;

总之优化器是对语法分析树的形态进行修改,把语法分析树变为查询树,确定执行方案。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

开始执行的时候,要先校验改用户是否有执行查询的权限,如果没有,就会返回没有权限的错误。如果有权限,就会去调用引擎的接口,返回接口执行的结果。

语句分析

我们以下面一条真实SQL查询语句来进行分析下MYSQL查询的执行过程

select id,name,sex,phoone from user t where t.age='26' and t.account='javadaily'
  • 首先客户端需要连接上数据库,如果账号密码错误直接返回错误信息,如果正确则进入下一步。
  • 在MYSQL8.0之前会先去查询缓存中,以这条SQL语句作为key在内存中查询是否有结果,如果有则先判断是否有权限,有权限则返回客户端,否则报错;如果没有从查询缓存命中则进入下一步
  • 通过分析器进行词法分析,提取sql语句的关键元素,比如提取上面这个语句是查询select,提取需要查询的表名为user,需要查询的列为id,name,sex,phoone,查询条件是age=26 和account=javadailly。然后判断这个sql语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
  • 上面的SQL有两种执行方案,优化器根据自己的优化算法选择执行效率最高的a方案(统计信息不准可能导致优化器选择错误的执行方案),确定了优化方案后就开始执行。

a. 先查询 account=javadaily 的用户,然后判断 age 是否等于26 b. 先找出 age=26 的用户,再查询 account=javadaily 的用户

  • 进行权限校验,如果有查询权限则调用数据库引擎接口返回执行结果;否则报错。

总结

到此这篇关于一篇文章弄懂MySQL查询语句的执行过程的文章就介绍到这了,更多相关MySQL查询执行过程内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL的join buffer原理
Apr 29 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
mysql事务隔离级别详情
Oct 24 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
MySQL分布式恢复进阶
Jul 23 MySQL
详解MySQL主从复制及读写分离
MySQL 表空间碎片的概念及相关问题解决
MySQL kill不掉线程的原因
May 07 #MySQL
MySQL数字类型自增的坑
May 07 #MySQL
MySQL获取所有分类的前N条记录
May 07 #MySQL
教你解决往mysql数据库中存入汉字报错的方法
MySQL时间设置注意事项的深入总结
You might like
discuz的php防止sql注入函数
2011/01/17 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
layui文件上传实现代码
2017/05/20 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
中软Java笔试题
2012/11/11 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
销售工作人员的自我评价分享
2013/11/10 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
公司股东出资证明书
2014/11/01 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
民事纠纷协议书
2016/03/23 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电