面试杀手锏===mysql一个sql语句的执行过程

mysql 同时被 2 个专栏收录
7 篇文章 0 订阅
2 篇文章 0 订阅

mysql 一个sql语句的执行过程

                               熊大

大家都知道我们公司喜提漂亮妹子一个。虽然这个妹子每天问我一些问题是我下不来台。但是同时也间接促进了我得技术水平。
话说妹子有一天说熊哥我想你请教个问题?假如我有一个sql如下

select * from test where k=?

而test表中是不存K这一列的。你说这个sql是在执行过程的那一步报错呢?

我。。。。。在这里插入图片描述

现在来看都不能说知耻而后勇了。已经习惯了那话返回来mysql他是怎么执行sql的呢。

我们先看下mysql构成。他是由两层组成分别是Service层存储引擎层

那每个层究竟是干什么的呢我画图如下:

在这里插入图片描述
上图可见Service共分五层那每层都是干什么用的呢?

  1. 连接器:
  • 管理连接 Service端与客户段经过经典的TCP握手连接。
  • 权限验证会验证连接是否有权限。
  1. 分析器:
  • 词法分析它会把你的语句变成它认识的比如 有这么一个语句select * from test 首先他会通过关键字select 判断出你这是一个查询语句 test 则有字符串转变成表名test
  • 语法分析 它则会分析你的语法是否符合mysql的要求
  1. 缓存

这里的缓存其实是指查询缓存比如一个select查询语句通过连接器之后第二步就是查询缓存如果缓存没有继续往下执行。需要注意mysql有一个机制就是一旦遇到update 这种更新语句缓存则会整体失效也就是说根据这个特性可以判断是否开启缓存如果一个表是热点表需要频繁更新则不建议使用缓存相反如果有一个静态表则可以开启缓存。

4.** 优化器**

顾名思义它是根据我们写的sql再优化选择出它认为的最优sql然后去执行。
举个例子select * from test where a=‘c’ and b=‘d’。其中a、b两列均有索引
这个sql执行过程中究竟用到那个索引则是优化器决定的。

如果是一个多表关联查询具体先连接那个表也是优化器决定的。

  1. 执行器

经过分析器知道sql要干啥优化器则拿到最优解那么执行器就是要获取我们想要的数据然后返回给客户端。执行器也需要判断下对这个表是否有操作权限

备注:执行器在执行一个sql 过程此处先不阐述。
此时此刻精神饱满终于能回答妹子的问题了?
这个sql报错应该是在分析器并且应该是在分析器的第二步语法解析这里。
mysql的设计参考了orcale 会在这部判断这个表中是否有这个列。

mysql有一些很明显的错误提示

"Access denied for user"出现这个错需要看下用户名密码是否错误是否具有连接权限连接器会在一步报的错。
You have an error in your SQL syntax use near需要注意use near附件是否出现错误这个错误是分析器导致的。

注意:其他的步骤则不会出现明显的提示但是优化器但是可能出现选错索引的情况。
如有疑问请加微信
在这里插入图片描述

  • 2
    点赞
  • 5
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值