面试官:你来讲讲一条查询语句的具体执行过程

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 对于一个开发工程师来说,了解一下 MySQL 是如何执行一条查询语句的,是一件很有必要的事情,不仅对于工作上有帮助,面试的时候还不至于被面试官问倒!下面我们来看看MySQL执行一条查询语句的具体过程吧一条看似非常简单的查询语句:select*fromTwhereid=1;然后 MySQL 就返回给了你结果,但是里面具体是如何执行的呢?

前言

分割线.jpg

对于一个开发工程师来说,了解一下 MySQL 是如何执行一条查询语句的,是一件很有必要的事情,不仅对于工作上有帮助,面试的时候还不至于被面试官问倒!

下面我们来看看MySQL执行一条查询语句的具体过程吧

一条看似非常简单的查询语句:

select*fromTwhereid=1;

然后 MySQL 就返回给了你结果,但是里面具体是如何执行的呢?

首先咱们先来看一张图,接下来的过程都是基于这张图来讲的:


image.png

连接器


当客户端连接 MySQL 时,会发出连接请求到连接器,连接器此时就会去验证这个连接的账号密码

如果账号或者密码不正确,客户端就会收到一个 Access denied for user 的错误,之后此次连接结束

账号密码正确,连接器会到权限表里面查询出该账号所拥有的权限,之后这个连接里面的权限判断,都是以此时读到的权限为根据

所以你知道为什么更改了一个账号的权限之后,一定要断开再重连才有效吧~

在实际中肯定有这样的情况,就是一个连接建立之后,但是我没有执行什么操作,那么就可以说这个连接处于空闲状态( sleep )

如果长时间都没有什么操作的话,连接器就会选择把它断开,这个时间是由 wait_timeout 来控制的,默认值是 8 小时

连接都被断开了,如果此时客户端再次发送请求想要进行一些操作的话,那就需要重新建立连接才能往下走

在数据库中有两种连接:

短连接:每次执行完很少的几次查询就断开连接,下次想查询时,就要重新建立一个

长连接:如果客户端持续有请求,那就一直使用同一个连接

建立连接是比较麻烦的,首先要发送请求吧,发送了请求要去验证账号密码吧,验证完了要去看你所拥有的权限吧,所以在使用过程中,尽量使用长连接

但是使用长连接又有新的问题:有时候,你会发现 MySQL 占用内存,因为是长连接嘛,所以它会在断开的时候才将资源释放掉。

这个时候可以考虑下面两种方案:


定期断开长连接


如果使用的是 MySQL 5.7 或者更高版本,可以在每次执行一个比较大的操作之后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重新连接和权限验证


分析器


连接器这一关是过来了,接下来就是去查询缓存

首先看缓存里面有没有,如果有呢,那就没有必要向下走,直接返回给客户端结果就可以了

如果缓存中没有的话,那就去分析器

但是聪明的你肯定发现了,我的小标题并不是缓存,而是分析器,为啥呢?

因为查询缓存的失效非常频繁,只要有对一个表的更新,那在这个表上的所有查询缓存都会被清空。所以就会导致 MySQL 费劲吧啦的把缓存给建立起来了,结果呢还没怎么用,一个更新操作,给弄没了

所以 MySQL 8.0 版本直接将查询缓存的整块功能都给删掉了,那么在这里也不细说,免得奇怪的知识增加

分析器首先会进行"词法分析",词法分析就是 select * from T where id=1; ,它会将 select 识别出来,哦,这是一个查询语句,接下来会将 T 也识别出来,哦,你是想要在这个表中做查询,然后将 where 后面的条件也识别出来,原来我需要去查找这些内容

OK ,“词法分析”之后,接下来是“语法分析”,语法分析主要就是分析输入的 SQL 语句合不合法

就比如英语里面的语法 “我用 is , 你用 are ”这种,如果不对肯定是不可以的,语法分析之后发现你的 SQL 语句不符合规则,就会收到 You hava an error in your SQL syntax 的错误提示


优化器


经过分析器分析之后, MySQL 就知道你要的是什么了

但是就像条条大路通罗马一样,看似是一条简单的 SQL 查询语句,有可能有好多条执行路径可以走,比如说要查询的表里面有多个索引,我使用哪儿个索引效率会比较高呀;多表联查的时候,我先关联哪儿个表效率会比较高呀

像这种就是优化器需要做的事情


执行器


优化器做完优化之后,就到了执行器

执行器就是要去执行语句了嘛,那我肯定要看看对于要查询的表 T 有没有查询权限,如果没有直接就拒绝,这没啥说的 如果有的话,那就会这样(在这里以 InnoDB 为例):

调用 InnoDB 引擎接口取这个表的第一行,判断 ID 的值是不是 10 ,如果不是就跳过,如果是那就放在结果集中;

调用引擎接口取“下一行”;重复相同的判断逻辑,直到这个表的最后一行

执行器将上述遍历过程中所有满足条件的行,组成记录集返回给客户端

至此,语句执行结束


存储引擎


存储引擎,一听名字大概就能知道,它负责的是对数据的存储和提取

关于存储引擎这块,最熟悉的应该就是 InnoDB 了,毕竟从 MySQL 5.5.5 版本开始它就成为了默认的存储引擎


举个栗子


OK ,到这里你可能就比较了解了,但是为了让大家理解的更深刻一些,这里还准备了个栗子,咱们来瞅瞅:

select*fromTwhere`name`='张三'andage ='18';


还记得MySQL 会怎么做吗?


通过连接器查询当前执行者的角色是否有权限,进行查询。如果有的话,就继续往下走,如果没有的话,抱歉,哪怕是你貌美如花,也要拒绝掉,同时甩你一个 Access denied for user 的错误信息

接下来就是分析器来分析语句了,嗯,你这个语句写的没啥问题,继续向下执行吧

此时来到了优化器,优化器就想,这条执行语句,有两种执行方案啊:

先查询表 T 中姓名为 “张三”的,然后再判断他年龄是不是 18 岁

先查询表 T 中年龄为 18 岁的所有人,然后再从里面找到姓名为“张三”的

等优化器决定选择哪个方案之后,执行器就去执行了。然后返回给客户端结果

面试造火箭,工作拧螺丝,希望能帮助到你!

多多转发让更多人受益!


image.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
158 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
6月前
|
SQL 存储 数据库
面试题19: 如何优化SQL查询?
面试题19: 如何优化SQL查询?
108 1
面试题19: 如何优化SQL查询?
|
6月前
|
NoSQL Java Redis
面试01-Redis 如何从海量数据中查询出某一个 Key
面试01-Redis 如何从海量数据中查询出某一个 Key
131 0
|
存储 缓存 监控
【面试题精讲】MySQL-查询缓存
【面试题精讲】MySQL-查询缓存
|
6月前
|
数据采集 JSON 数据挖掘
2024年利用Python查询IP地址_怎么查python文件中ip地址,2024年最新15个经典面试问题及答案英语
2024年利用Python查询IP地址_怎么查python文件中ip地址,2024年最新15个经典面试问题及答案英语
|
4月前
|
JSON NoSQL MongoDB
面试题MySQL问题之想使用Neo4j查询可变数量的关系节点如何解决
面试题MySQL问题之想使用Neo4j查询可变数量的关系节点如何解决
48 1
|
Java 关系型数据库 MySQL
|
6月前
|
监控 数据库 索引
面试题21:如何优化查询命令?
面试题21:如何优化查询命令?
|
6月前
|
SQL
面试必备杀技:SQL查询专项训练(二)
面试必备杀技:SQL查询专项训练
|
6月前
|
SQL
面试必备杀技:SQL查询专项训练(一)
面试必备杀技:SQL查询专项训练