从查询语句执行流程看MySQL架构

news2025/1/15 19:32:55

常言道,看待一个事情要先知全貌,从高维度认识、理解,然后再深入各个细节,一一击破。MySQL的学习也不例外,那么你知道一条SQL在MySQL中执行要经历哪些步骤吗?每个步骤都有MySQL的哪些“零件”参与吗?如果不清楚的话,可以阅读本文。

SQL执行流程

在MySQL客户端或者JAVA应用程序中查询一条最简单的语句比如select * from T where ID =10;你知道经历哪些步骤吗?

连接

你要执行查询语句前肯定要先和MySQL建立连接啊,那怎么建立连接呢?

可以通过下面的命令:

mysql -h ip -P port -u$user -p
复制代码
  • 经过三次握手建立连接成功后, 验证客户端传来的连接用户名和密码,并不是任何阿猫阿狗都可以连啊
  • 如果用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
  • 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限

这个用于连接的“零件”就是MySQL的连接器,它主要负责跟客户端建立连接、获取权限、维持和管理连接。

查缓存

现在连接建立好了,相当于客户端和MySQL服务端的“传输管道”有了,开始查数据了。

都说性能不够,缓存来凑,MySQL“为了性能”,也实现了查询缓存。

  • MySQL以查询的语句作为key去查询缓存中获取对应的value
  • 如果没有的话,会去做真实的查询
  • 如果有的话,直接返回缓存中的数据
  • 如果这个表发生更新,查询缓存会清空

所以关键点在于MySQL表的更新频率以及缓存的命中率,我们可以根据下面命令查看监控查询缓存:

show status like '%Qcache%';
复制代码

  • Qcache_hits: 表示有 多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
  • Qcache_inserts: 表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这也正常。

这上面一个过程就是MySQL的查询缓存操作。

但是实际情况是查询缓存往往弊大于利,因为查询缓存的失效非常频繁,一般建议大家在静态表里使用查询缓存。但是在MySQL 8.0中已经去掉了查询缓存。

分析验证

如果没有命中查询缓存,就要开始真正去查了。在查询前,MySQL肯定要“理解”你这条SQL语句啊,所以要有个“零件”去分析验证你的SQL语句,那究竟是怎么个分析过程呢?

  1. 词法分析, 你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面 的字符串分别是什么,代表什么。
  2. 语法分析,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足 MySQL语法。

这也是为什么我们的SQL语句存在语法问题的时候会报错,就是这个叫做分析器的零件报出来的。

优化

语法没问题,就够了吗?当然不够,智能的MySQL还要帮我们做优化,那都做哪方面的优化呢?

  1. 比如有多个索引的时候,智能选择一个它认为最佳的索引
  2. 多表关联的时候,决定表的连接顺序
  3. 对子查询进行优化
  4. 对连接语义进行了外连接消除、嵌套连接消除....

这个过程就是由MySQL的优化器做的。

执行

优化器阶段完成后,这个语句的执行方案就确定下来了,然后真正的开始执行了。

在执行之前需要判断该用户是否具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。

我们以一开始的查询语句select * from T where ID =10;为例,ID没有索引,并且采用的innoDB作为存储引擎,整体查询的流程如下:

  • 调用 InnoDB 存储引擎接口取这个表的第一行,判断 ID 值是不是1
  • 如果不是则跳过
  • 如果是则将这行存在结果集中
  • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户,这一个过程就是由MySQL的执行器执行的。

MySQL逻辑架构

上面讲解了查询语句的真个执行流程,涉及了MySQL的各个“零件”,我们将这些零件组装组装,可以形成下面的逻辑架构图:

大体来说,MySQL可以分为Server层存储引擎层两部分。

  • Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDBMyISAMMemory 等多个存储引擎。所有的存储引擎都共用同一个Server层。

总结

本文通过以一个查询语句的执行流程为例,讲解了MySQL整体的逻辑架构,对MySQL的各个部分有了一个全局的认知。这样,在遇到问题的时候,也比较有针对性,比如对于一个select * from T where k=1,报了Unknown column ‘k’ in ‘where clause’的错误,我们就很快的知道是分析器报出来的,因为分析器会分析我们SQL的语法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双十二薅羊毛!这几款数码好物不可错过

双十二即将开始,在这段时间里有的人已经将自己心仪的塞满了整个购物车了吧,而有的人还没想好到底要入手什么,如果你也是还在纠结的话,不知道该买什么又或是想知道哪些产品更适合你入手,不妨来看看小编今天为你带来的这…

【JavaScript函数】

JavaScript函数1 本节目标2 函数的概念3 函数的使用3.1 声明函数3.2 调用函数3.3 函数的封装4 函数的参数4.1 形参和实参4.2 执行过程4.3 注意点4.4 函数形参和实参个数不匹配问题5 函数的返回值5.1 return语句5.2 函数返回值注意事项5.3 break,continue,return的区别6 argumen…

Python 中的安全密码处理

前言 几乎每个应用程序都需要某种形式的身份验证、密码处理或使用安全凭据,例如 API 密钥。您可能不是安全专家,但您应该知道如何安全地处理所有这些密码和凭据,以保护应用程序用户的凭据和数据以及您自己的 API 密钥和各种令牌。 &#xf…

GitHub 最全的开发资源汇总系列

GitHub 最全的开发资源汇总系列 了解学习开发各种项目!!! GitHub 最全的开发资源汇总系列 由伯乐在线持续更新 Java 资源大全;Java资源大全中文版,包括开发库、开发工具、网站、博客、微信、微博等。 —— Java资源…

建筑结构抗震分析之施加地震波的方法与理论机理

一、地震波的输入有三种方式: 第一种是是质量加速度施加法,通过达朗贝尔原理,将地震作用转化为施加在质点上惯性力;第二种是底部位移法,在结构底部直接输入位移地震波,模拟地面震动反应,计算结…

Function 源码解析与实践

作者:陈昌浩 1 导读 if…else…在代码中经常使用,听说可以通过 Java 8 的 Function 接口来消灭 if…else…!Function 接口是什么?如果通过 Function 接口接口消灭 if…else…呢?让我们一起来探索一下吧。 2 Functio…

共享新机遇 共谋新发展 | 蓝海创意云携元宇宙技术参展2022昆明南博会

11月19日,第6届中国-南亚博览会暨第26届中国昆明进出口商品交易会(以下简称南博会)在昆明盛大开幕,经过10年的精心打造,南博会已经成为集国际贸易、投资洽谈、文化交流等为一体的高水平综合性国际博览会。 蓝海创意云…

草料二维码表单如何推送至工作群

在我们使用草料二维码进行隐患排查、故障报修、预约报名、巡检异常等场景时,需要时不时查看草料后台,检查是否有新的信息更新,或者提交后人工再单独通知一次,经常造成信息传递不及时,那么能不能当有表单提交时&#xf…

项目管理软件有哪些,哪个好用?

做过项目的朋友肯定都知道,项目管理软件是专门用来帮助计划和控制项目资源、成本与进度的计算机应用程序。这类软件可以帮助企业管理项目进度,节省项目人力成本支出,增进团队协作与沟通,提升团队成员工作效率,让资源可…

Java本地高性能缓存实践

Java缓存技术可分为远端缓存和本地缓存,远端缓存常用的方案有著名的redis和memcache,而本地缓存的代表技术主要有HashMap,Guava Cache,Caffeine和Encahche。远端缓存将在后面的博文中进行深入探讨,此处挖个坑&#xff…

【013】基于Vue的酒店客房管理系统(含管理员、普通用户两种身份(附源码数据库、课设报告)

这里写目录标题一、系统详细介绍二、系统部分设计思路三、项目获取一、系统详细介绍 前言: 这次带来的是基于NodejsVueMysql的酒店客房管理系统,含非常非常详细的课设报告,觉得物超所值!文末附源码数据库、论文百度云链接 系统登…

高空简易水果采摘装置设计(CAD+proe)

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2研究现状 1 1.2.1国外果园采摘机械现状 1 1.2.2国内果园采摘机械现状 4 1.2.3果园机械存在问题 5 1.2.4果园采摘机械的发展趋势 6 1.3研究主要内容 7 2 高空简易水果采摘装置原理 8 2.1 水果实采摘方式的选择 8 2.…

零基础入门JavaWeb——HTML相关知识

一、HTML概念 HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭建网页结构,在网页上展示内容。 1.1 超文本 HTML文件本质上是文本文件,而普通的文本文件只能显示字符。但是HTML技术通过HTML标签把其他网页、图片、音频、…

微信公众号留言如何实时提醒

几乎每个官方品牌都有一个微信公众号,并且会不定期发布和品牌、产品相关的内容,也经常会收到一些用户的留言。但并不是运营人员每时每刻都登录在公众号后台,查看并回复这些用户的问题,如果我希望有用户给我们公众号留言后&#xf…

运动酒店,如何“奇袭”文旅产业精准蓝海赛道——缤跃酒店

近日,缤跃酒店战略牵手昌泰高速,进驻雷公坳文体产业园,共建江西大健康产业重点基地。作为锦江酒店(中国区)旗下360度健康运动中高端生活方式品牌,缤跃高调与南昌雷公坳文体产业园达成战略合作,强势入驻体育产业园&…

Python读取复杂电子表格(CSV)数据小技巧一则

关于CSV格式 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。“CSV”并不是一种单一的、…

竞赛——【蓝桥杯】2022年12月第十四届蓝桥杯模拟赛第二期Java

1、最小的2022 问题描述 请找到一个大于 2022 的最小数,这个数转换成二进制之后,最低的 6 个二进制为全为 0 。 请将这个数的十进制形式作为答案提交。 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数…

VWware-安装AD域服务

AD域控就是基于轻型目录访问协议将企业网络中的资源(包括用户、计算机、服务器、数据库、共享文件、共享打印机等)合理、安全、有效的管理起来。通俗来说就是:解决了单点登录,简化了身份认证,完成了不同用户资源之间的…

Python连接Clickhouse遇坑篇,耗时一天成功连接!

首先!!!!!!!!!不要看网上那些乱七八糟的使用clickhouse-driver连接了,真tm难用,端口能搞死你那种,超级烦! 推荐直接看官方…

建筑材料企业如何进行采购价格管理?SCM系统助力企业灵活控制采购价格

如今的“广厦千万间”早已矗立在中华大地的各个角落,建筑行业早已经成为中国国民经济发展的重要支柱性产业。同时随着近几年数字经济的兴起,给传统建筑材料行业带来了巨大挑战,如何优化生产运营、保障设备稳定运行、提高和稳定产品质量是每个…