2.MySQL查询语句如何执行?

MySQL分为Server层和存储引擎层两个部分,不同的存储引擎共用一个Server层。

在这里插入图片描述

Server层:大多数MySQL的核心服务功能都在这一层,包括连接处理、授权认证、查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层:存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。

MySQL客户端与服务端的通信方式是“半双工”,客户端一旦开始发送消息另一端要接收完整这个消息才能响应,客户端一旦开始接收数据就没法停下来发送指令,一请求一响应。

连接器

第一步,先连接到数据库上,当客户端(应用)连接到MySQL服务器时,服务器需要对其进行认证,认证基于用户名、原始主机信息和密码,一旦客户端连接成功,服务器会继续验证客户端是否具有执行某个特定查询的权限(例如,是否允许客户端对某一数据库的某一表执行SELECT语句)

连接命令:

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

输完命令之后,需要在交互对话里面输入密码,密码不建议在-p后面直接输入,这样会导致密码泄露。

查询缓存

第二步,查询缓存,每次MySQL执行过的语句及其结果会以key-value形式缓存在内存中,key是查询语句,value是查询结果。如果查询能够在缓存中找到key,那么这个value就会被直接返回客户端。

但是大多数情况下我会建议不要使用缓存,因为查询缓存的失效非常频繁,只要对一个表的更新,即便是更新一些与缓存无关的字段,这个表所有的缓存都会被清空,因此很可能会费劲地把结果存起来,还没使用就被一个更新全部清空,对于更新压力的数据库来说,查询缓存的命中率会非常低,除非业务就一张静态表,很长时间才会更新一次。(例如系统配置表)

MySQL提供了按需使用的方式,可以将参数query_cache_type设置为DEMAND,这对于默认的SQL不使用查询缓存,而对于确定要使用查询缓存的语句,可以使用SQL_CACHE显示指定。(SELECT SQL_CACHE * FROM TAB)

通过查询语句做哈希算法得到一个哈希值,因此这里要想命中缓存,查询SQL和缓存SQL必须完全一致,每次检查缓存是否命中时都会对缓存加锁,对于一个读写频繁的系统使用查询缓存很有可能降低查询

注意:MySQL8.0版本直接将缓存的整个功能模块删掉了

分析器

第三步,分析器,如果没有命中缓存,就会执行SQL语句,首先让MySQL知道我们需要做什么,因此需要对SQL语句解析,MySQL从输入的“select”关键字识别出来,这是一条查询语句,把字符串“TAB”识别成表名TAB,检查查询中涉及的表和数据列是否存在或别名是否有歧义

解析器的工作:语法分析(生成句子),语义分析(确保这些句子讲得通),以及代码生成(为编译准备)

注意:分析器和解析器是一个东西,有些书叫分析器,有些书叫解析器,就是不同的叫法而已

优化器

第四步,优化器,经过分析器MySQL知道我们需要什么了,在开始执行前,还要经过优化器进行处理,优化器是在表里面有多个索引时,决定使用哪个索引,或者在一个语句有多表关联(join)时,决定各个表的连接顺序。

优化器会生成执行计划

执行器

第五步,执行器,MySQL通过分析器知道要做什么,通过优化器知道怎么做,开始执行前,要先判断一下是否有表TABLE查询权限,如果有打开表,根据表的引擎定义,去使用这个引擎提供的接口。

根据执行计划,调用存储引擎API来查询数据

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值