一文读懂MySQL查询语句的执行过程
需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX 这样的SQL,那么当我们向数据库发送这样一个请求时,数据库到底做了什么?
我们今天以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
的用户
-
进行权限校验,如果有查询权限则调用数据库引擎接口返回执行结果;否则报错。
以上,希望对你有所帮助!
这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取!
001:《程序员必读书籍》
002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》
003:《互联网企业高并发解决方案》
004:《互联网架构教学视频》
006:《SpringBoot实现点餐系统》
007:《SpringSecurity实战视频》
008:《Hadoop实战教学视频》
009:《腾讯2019Techo开发者大会PPT》
010: 微信交流群
本文分享自微信公众号 - JAVA日知录(javadaily)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
观看视频就会导致崩溃,微软正紧急修复 Edge 浏览器问题
最近一段时间,当用户将 Edge 浏览器升级至 90 版本之后,似乎开始遭遇浏览器频繁崩溃的问题。如果你也面临这样的问题,那你并不是个例。 近日有大量用户报告,在他们播放 YouTube 视频时面临浏览器持续崩溃的问题,在 Reddit 上详细描述这个问题的帖子甚至可以追溯到 15 天前。 当时一名来自微软的工程师在论坛上回应,让用户尝试禁用硬件加速来作为该问题的解决方法。然而,该工程师昨天在 Reddit 上证实,这个错误可能比原本预计的更为严重,而且有 "围绕这个问题的多种情况"。除此之外他还补充道,那些面临浏览器崩溃的用户可以尝试下载并运行最新的 Canary 版本,以检查他们的问题是否已经通过该版本中实施的错误修复得到解决,并希望受到影响的用户可以提供反馈和崩溃报告。 该问题能够持续复现,即用户打开 YouTube 开始以全屏模式播放视频,之后浏览器就会出现无响应,随后浏览器就直接崩溃。根据 Reddit 用户反馈,目前的临时解决方法是前往浏览器的任务管理器(按 shift + esc),关闭消耗资源最多的任务。 在修复更新最终被引入稳定版本之前,我们可能还会看到有更多用户遭遇...
- 下一篇
数栈人:从青铜到星耀,10年大数据人的奋战晋级之路
今天,大家就请跟着数栈君一起,和申杭聊聊他从青铜到星耀的大数据之路。 数栈君:申杭,你是07年从华中科技大学软件工程专业毕业的,能说说你当时为什么选择这个专业吗? 申杭:当时会计、师范、机械制造、土木类专业比较热门,一般家人都会让报这些专业,出来好就业。而电子、计算机、软件工程类的专业刚刚兴起,前景并不是很明朗,不过我那时对计算机还是挺好奇的,觉得电脑上开几个黑窗口,随便敲一堆英文字母,就可以做很多事情,很神奇,当看到软件这个名字,感觉很高端、神秘,所以就报了软件工程专业。说起来,我是华科软件专业第二届的学生,算是较早入计算机坑的人。 骚粉的杭哥 数栈君:那现在很多软件工程师估计都得叫你一声前辈了。你有10多年大数据经验,可以说很资深了,几乎见证了中国大数据行业的诞生和发展。能给大家讲一下你的工作经历吗? 申杭:这些经历要说起来,能讲三天三夜,不过今天就长话短说吧。 倔强青铜:初入数据工程师的世界 2007年毕业时,商业智能(BI)在中国发展势头正猛,我的第一份工作就是在四大管理咨询公司,行业所称“四大”之一的上海埃森哲做BI顾问。期间,负责给平安保险、某外资银行做数据仓库的模型设计和...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池