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

接下来的有关mysql基础架构的文章参照物来自于极客时间的Mysql实战45讲
Mysql 其实是My ESS QUE ELL的简写

Mysql的基础架构示意图:
在这里插入图片描述
大体看的出来:mysql分两部分,Server层和存储引擎层;
Server层包括的东西就比较多了,除了分析器优化器等,还有内置函数,触发器等都在这一层;而存储引擎层则是负责数据的存储和读取

第一部分:连接器
连接器就是负责跟客户端建立链接,获取权限,维持和管理链接;
注意:-p和密码之间没有空格

 mysql  -h 192.16.1.12  -p 3306 -uroot -p123 

链接完成后,如果没有后续的动作,这个链接就处于一个空闲的状态;如果太长时间没动静,连接器就自动断开。如果断开之后客户端发送请求的话,就会提示错误信息,需要重新进行链接

长链接和短连接
长链接是指链接成功之后,如果客户端持续有请求,则一直使用同一个链接;短连接是指每次执行完很少的几次查询之后就断开链接,下次查询则会直接建立一个新的链接
建立链接过程比较复杂,建议直接使用长链接

全部使用长链接的话,可能会发现mysql占用内存非常快,这么解决??
1、定期断开长链接。使用一段时间后,或者程序里判断执行过一个占用内存特别大的查询后,断开链接,在进行新的链接
2、在mysql>5.7之后的版本中,执行mysql_reset_connection来重新初始化链接资源。这个链接过程不需要重连或者重新进行权限的验证,但是会将链接恢复到刚刚创建完的状态

第二部分 查询缓存

mysql拿到一条sql语句,会先到缓存里看看是否执行过此sql语句,如果执行过,可能就会有sql作为key,结果作为value的形式存在缓存中;如果没有执行,则执行后面的执行操作,完成后,将结果存入缓存中;

但是大部分情况下,不建议使用查询缓存,为什么呢??
缓存失效的概率极高,只要对一个表有更新,这个表的缓存就会被清空;如果一个表经常被更新的话,那查询缓存的命中率就会很低。查询缓存就适合用在不经常更新的表中。
在mysql8中查询缓存已经被废弃了

第三部分 分析器

分析器分词法分析和语法分析;
词法分析就是分析字符串代表什么;而语法分析则是在词法分析的基础上,根据语法规则,判断这个sql语句是否满足sql语法

高性能mysql中提到解析器和预处理器
解析器处理语法和解析查询,会生成一个新的解析树
预处理器进一步检查解析树的合法性,比如数据表和数据列是否存在; 合法性通过后才会交给下面的优化器

第四部分 优化器

优化器就是怎么优化这条sql语句,比如有多个索引的时候,决定先走那个索引;有多个join的时候,决定表的链接顺序。
虽然很多sql语句执行结果相同,但 执行效率却又很大的不同。就类似于1+2+……+99+100 ,别人用(1+100)*50而你则开始从1加到100。

第五部分 执行器

mysql通过分析器知道你要干嘛,通过优化器知道要怎么做,就要开始执行了
1、判断你对于这个表***有没有执行查询的权限***;没有就返回没有权限的error
2、执行器根据定义的索引,使用这个引擎提供的接口;将整个查询过程中满足条件的行组成一个记录集作为结果返回;

至此:一条sql语句就执行完成了!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值