百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

MySQL相关(一)- 一条查询语句是如何执行的

wptr33 2024-11-17 16:44 31 浏览

前言

学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用比较多的还是 5.7,所以今天在这里还是针对 5.7 来做讨论。

看了官网关于 MySQL 的介绍之后,我发现一个有趣的事情。在我身边的同事,很多都是把 MySQL 读错了,当然,也是因为大家已经约定俗成了,所以我卖的关子是,MySQL 大家一般会都成 my sequel,但是在官网上读法是这样的[ My Ess Que Ell ],即把 s q l 分开来读。当然这个不重要啦,这里只是跟大家唠嗑一下哈哈~想验证的伙伴可以点击这个What is MySQL?

下面开始进入正题:

下面是 MySQL 的发展过程,目前的系统基本上都是分布式微服务的了,由于支持事务的特性,所以 innodb 为默认的存储引擎,也是我们今天课程的主角。(MyISAM 和 Innodb 的区别在此不做赘述,想了解 MySQL 的引擎可至 MySQL 引擎链接查阅。

接下来我们会以这张脑图的一些知识点展开来讲,但是由于文章篇幅有限,有些点可能只会一笔带过,有兴趣的小伙伴可以到我的公众号下与我留言讨论。

我们今天的重点,在于将 MySQL 语句的执行流程给大家梳理一遍(如果文章哪里有疏漏的话,尽请大家批评指正)。

正文

一条查询语句是如何执行的

查询语句的执行分为以下几步:

  1. 查询缓存
  2. 解析器生成解析树
  3. 预处理再次生成解析树
  4. 查询优化器
  5. 查询执行计划
  6. 查询执行引擎
  7. 查询数据返回结果
  8. 查询缓存

通过如下语句可查看缓存开关情况(默认关闭):

show variables like 'query_cache%';
  • MySQL 拿到一个查询请求后先会在查询缓存中看看是否执行过此语句,之前执行的语句会以 key-value 的形式缓存在内存中,key 是缓存的语句,value 是查询的结果
  • 如果命中缓存则直接将结果返回,如果没有命中则继续执行后面

在 MySQL 中默认是关闭的,官方也建议关闭,将缓存交托给第三方如 redis 处理,为啥:

  • 查询缓存的失效特表频繁,对一个表的更新都会失效这个表所有的查询缓存,对于更新频繁的表命中率太低
  • MySQL 8.0 直接删除查询缓存

解析器生成解析树

1.语法解析

语法解析是解析你的语句是不是满足 MySQL 语法标准,如果不对则会 :

ERROR 1064 (42000): You have an error in your SQL syntax … 关于错误码在官网有说明

2.词法解析

关于解析完生成的解析树类似下图,我以’select name from user_info where sex=1 and age>20’为例:

预处理再次生成解析树

语义解析,在语法及词法解析完之后,进行预处理之后再次生成解析树。

查询优化器

在这一步将前面生成的解析树优化成一个执行计划。

在这步做的事情主要有:

  1. 选择最合适的索引;
  2. 选择表扫还是走索引;
  3. 选择表关联顺序;
  4. 优化 where 子句;
  5. 排除管理中无用表;
  6. 决定 order by 和 group by 是否走索引;
  7. 尝试使用 inner join 替换 outer join;
  8. 简化子查询,决定结果缓存;
  9. 合并试图;

顺便提一下,optimizer_trace 优化器追踪器,在 MySQL 中是默认关闭的(毕竟开启也会消耗性能嘛对吧),可以使用 set 语句修改一下 optimizer_trace的开关,感受一下:

set optimizer_trace='enabled=on '

先查询优化器追踪的开关:

show variables like 'optimizer_trace%';

执行完一条语句之后执行下面语句查看优化器追踪:

select * from information_schema.optimizer_trace\G

可以看到一个 json 类型的字符串,主要是语句优化的三个阶段,篇幅有限,这里不展开,对照着看应该可以看懂。

查询执行计划

查询最后一次查询的消耗,用以比较开销:

show status like 'Last_query_cost';

在这一步选择开销最小的计划执行

查询执行引擎

这里执行器会先对权限做一个判断,如果有权限,才会执行以下步骤,否则跑出权限异常:

  1. 调用 Innodb 引擎接口获取这个表的第一行,判断ID是否为10,如果不是跳过,如果是则存在结果集中;
  2. 引擎执行下一行,重复判断相同的逻辑,直到最后一行;
  3. 最后将满足结果的结果集返回;
  4. 对于有索引的表也差不多,第一次是调用满足结果的第一行接口, 下来是查找满足结果的下一行接口

查询数据返回结果

将查询数据的结果返回给查询的客户端,如果有缓存则返回缓存(前面已经说了默认关闭),可以说就大功告成了哈哈哈哈,真是曲折。

总结

经过上面一系列的梳理,相信大家对 MySQL 查询语句的流程也有了一个大致的了解,下面是针对查询语句的流程做的一张图,方便大家记忆理解:

原文链接:https://blog.csdn.net/weixin_42669785/article/details/104107328

相关推荐

开发者必看的八大Material Design开源项目

MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...

另类插这么可爱,一定是…(另类t恤)

IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...

Android常用ADB命令(安卓adb工具是什么)

杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...

微软Mac版PowerPoint测试Reading Order Pane功能

IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...

Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍

前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...

用云存储30分钟快速搭建APP,你信吗?

背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...

谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果

Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...

iOS文本编辑控件UITextField和UITextVie

记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...

Android入门图文教程集锦(android 入门教程)

Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...

如何使用Android自定义复合视图(如何使用android自定义复合视图)

在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...

原生安卓开发app的框架frida常用关键代码定位

前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...

教程10 | 三分钟搞定一个智能输入法程序

一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...

(Android 8.1) 功能与新特性(android的功能)

和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...

怎样设置EditText内部文字被锁定不可删除和修改

在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...

如何阻止 Android 活动启动时 EditText 获得焦点

技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...