暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL中查询语句的执行过程

程序猿集锦 2021-06-24
414

MySQL查询语句执行过程

最新总结了一下MySQL中,查询语句是如何执行的,画了一张图,如下所示。

如下思考点:

  • 为什么对权限的检查不在优化器之前做?

    图中的那个权限认证是在连接器上验证客户端连接服务端的权限,这里说的权限指的是有没有操作具体某张表的权限。譬如说你去景区旅游,先在景区门口验票,看你有没有进入里面的权限,进去后可能某个景点也是收费的,想进去也要验票!

连接器

建立连接,验证用户权限。

  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

  • 一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

  • 客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。

查询缓存

MySQL8.0版本中已经废除该功能,因为该功能的弊大于利。查询缓存的失效率特别高。只要表中的记录有更新,对于这个表的查询语句对应的缓存将全部失效。查询缓存中,使用SQL语句作为key,使用查询得到的结果集合作为value。所以,查询的SQL需要一模一样,多一个空格都不可以使用到缓存。

解析器(分析器)

解析SQL语句中的语法,生成解析树。验证关键词是否正确,比如:select、from、where、group by、order by等关键词是否正确。

预处理器

根据上一步生成的解析树,再进一步分析SQL语句的语义是否正确,验证数据表是否存在,查询的字段是否存在。比如:

  1. select a.id, a.name from table1 as a;

这个语句中的 a.id是否存在,a.name是否写错等。

查询优化器

根据SQL语句,生成执行计划。有可能有多种执行方式。给予成本cost计算,来决定采用哪一种执行计划。

执行器

在真正开始执行SQL语句之前,会再次判断一下当前登录的用户,是否对相关的表有查询权限,如果有,会按照执行计划去执行SQL,否则直接返回权限不足。调用存储引擎层的API接口,然后接受返回的结果集。然后返回给客户端。

以上如有理解不正确的地方,还原指正。


微信搜索“coder-home”或扫一扫下面的二维码,

关注公众号,第一时间了解更多干货分享,还有各类视频教程资源。



文章转载自程序猿集锦,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论