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

 通过本篇文章,你会明白一条查询语句是如何执行的。
 让我们知其然,知其所以然。

基础架构

在这里插入图片描述

 根据上图可知,大体MySQL可以分为Server层和储存引擎层
 Server层包括连接器,查询缓存,分析器,优化器,执行器。
Server层包括大多数核心服务功能,以及所有的内置函数。所以所有跨存储引擎的功能都在这一层实现。
 存储引擎层负责数据的存储和提取。它的架构模式是插件式的,包括很多种存储引擎,其中innoDB是现在最长用的。而且从Mysql5.5.5开始成为了默认存储引擎。如果不进行指定就会使用InnoDB,如果要使用其它存储引擎,就要在create table语句中使用engine = memory.来指定存储引擎。

组件详解

连接器

 使用数据库第一步肯定是建立连接,此时使用的就是连接器。连接器的功能是负责和客户端建立连接,获取权限,维持和管理连接
连接命令:

mysql -h$ip -P$port -u$user -p

 输入完成后就需要在接下来的对话框中输入密码,密码也可以直接加在-p后面但是不建议这样写,因为这样写可能导致密码泄露。
 连接命令中mysql是客户端工具,用来和服务器建立连接。完成tcp握手之后,就会验证你的用户名和密码。

  • 如果用户名密码不正确就会返回"Access denied for user"错误,然后结束运行。
  • 如果验证通过,连接器就会去权限表里查出你的权限,以后这个连接的权限判断逻辑都会依赖于此次读到的权限。
  • 也就是说,你登陆之后,如果你的权限又被管理员修改了,也不会影响你的此次操作,只有再重新建立连接才会使用新的权限。
    建立的连接有两种状态,一种是工作状态,一种空闲状态,使用 show processlist 命令可以看到状态。
     如果你建立连接之后没有后续操作就会处于空闲状态。如果长时间处于空闲状态,连接器就会自动断开连接,这个时间是由参数wait_timeout控制的,默认8小时。
     如果一个客户端持续有请求,就会一直使用一个连接,长时间不断开的一个连接就是长连接
    建立连接的过程比较复杂,所以建议尽量减少建立连接的动作,也就是尽量使用长连接。
     但是如果长连接很多时就会发现有时候mysql占用的内存涨的很快,这是因为MySQL在执行过程中临时使用的内存是管理在连接对象中的。这些资源在断开连接时才会释放。所以长连接积累下来就会导致内存占用太大。被系统强行杀掉,从表现来看就是MySQL异常重启了。
     如何解决这个问题呢?
  • 1:定期断开长连接。之后重新查询时重新建立连接。
  • 2:可以通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重新建立连接,但是会将连接恢复到刚建立的状态。

查询缓存

 当连接建立完成后,下面的操作就是查询缓存,他会拿着要执行的语句去查询缓存。
 在MySQL中每次查询的语句和查询结果会以key-value的形式存在缓存中,每当一个查询语句进入之后,就会去缓存中查找,如果可以找到,就直接返回,不继续进行下面的操作。没查到则继续。所以缓存的使用会大大提高查询效率。
 但是大多数情况下不建议使用缓存,因为查询缓存失效的频率非常频繁。只要有一个表的更新,这个表的所有查询缓存都会失效,被清空。所以利用率不高。
 如果你的表是静态表,比如2020年的每个城市的财政收入,人口数量。则适合使用查询缓存。
 MySQL中缓存的使用可以按需索取。通过将参数query_cache_type设置成DEMAND,这样就对于sql语句都不使用查询缓存。如果要使用缓存则可以使用SQL_CACHE显示指定,例如:select SQL_CACHE * from T where ID=20。
 注意:MySQL 8.0 之后没有查询缓存的模块了。

分析器

 如果查询缓存没有命中,也会进入分析器。分析器有“词法分析”和“语法分析”。
 它会先进行“词法分析”。通过词法分析识别出里面的字符串分别是什么,代表什么。
 之后会进行语法分析。判断输入的sql语句是否满足MySQL语法。语法不对就会报“you have an error in your SQL syntax”。一般语法错误会提示第一个出现错误的位置。

优化器

 优化器是在表中有多个索引的时候,决定使用那个索引的;或者在一个语句有多个表关联的时候决定各个表的连接顺序。

执行器

 执行器阶段进行语句执行,它在执行之前会先进行权限判断,如果你有对这个表的查询权限就会继续,如果没有返回没有权限的错误。如果命中缓存则在返回结果的时候进行权限判断。查询的过程就是循环遍历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值