mysql(二)--sql执行的曲折

mysql

  • 优化器

  • 插拔式的存储引擎–》作用于表

sql执行的曲折

客户端 =》 连接器 =》 查询缓存 =》 有缓存 =》 返回客户端

                    
=》 没有缓存 =》 分析器 =》 优化器 =》 执行器 =》 BinLog[归档日志] =》 存储引擎

以上可以分为两个部分:

  • server
  • 存储引擎层

首先来说[连接器],也就是我们每次使用mysql的时候,我们需要输入 host IP username password 来做连接登录mysql,我们做了这个之后,mysql
需要作出回应呀,看看有没有这个叫[什么鬼]的小伙子,再看看这个[什么鬼]小伙子有没有一系列的[特权]呀。。。就拿PHP来说,在使用mysql的时候,不管是
mysqli还是PDO,都需先去连接mysql,同样的mysql在这些连接后也需要作出回应,那么这个[守门的]就是 连接器。同时也需要注意:mysql
连接器,比如说我们当前的用户test,它现在是一个屌丝,什么都没有,它连上了mysql,但是之后,突然走了狗shi运。牛pi了。但是,它进去mysql之后就没有
出来过,那么就相当于它还没有拿到特权,还是个屌丝。只有它重新离开再进去,它的特权才能生效。

  • mysql 客户端和服务端通信

通信方式 【半双工–对讲机】【全双工–打电话】【单工–收音机】

mysql 是半双工

客户端一旦开始发送消息另一端要接受完整个消息才能响应

客户端一旦开始接受数据没法停下来发送指令

show processlist;/show full processlist;

sleep

query

locked

sorting result 线程正在

sending data 向请求端返回数据

再来说[缓存],mysql的缓存默认是没有开启的,也就是要我们手动开启。
show variables like query_cache_type= 0关闭 | 1开启 | 2按需开启
它的缓存存储形式就是像key => value这种形式,key就是我们的查询语句,比如:select * from users;它的value就是我们查询到的结果集。如果
我们开启缓存这个功能呢,我们第一次查询结果就会放到缓存中。第二次再次查询 [相同的] 的语句,就会命中缓存。它就会直接返回缓存中的结果集,没有命中,
就会再次查询。虽然说缓存比较好,有时也加快了我们的查询速度,但是,但是,但是。它的使用限制确实非常有限。

1.) 要想命中缓存,两次的查询语句必须一模一样

2.) 查询的时候,select 必须是作用于表,也就是你的select * from [table_name];才有作用,如果是select 1+1;这是不会有缓存产生的

3.) 比如我们第一查询的时候,有一条记录,在第二次查询的时候,你新增了一条记录,那么缓存一样会失效。就是我们只要涉及到[增,删,改]缓存马上就不会起作用了,
就算是和第一次的查询语句一样,缓存也会失效

4.) 就是我们要得到的数据块,特别大,特别多的时候,我们使用缓存这也是非常消耗内存的

5.) 当查询的时候,我们使用函数,那么缓存一样不会起作用

查看是否使用缓存语句 show status like "Qcache%"

[分析器] 在mysql没有命中缓存的时候,就会到达下一站,分析器。分析器又分为 词法分析语法分析

词法分析: 就是mysql它的一条SQL语句由那些组成,就是mysql自己的分词[token],我的理解应该就是把写的一条SQL语句一点一点整理出来,然后组成
mysql它自己所能识别的

语法分析: 语法分析应该就是分析经过词法分析的SQL语句是否符合mysql的语法

[优化器] 到了这一阶段,可以说,基本上已经走到了一半了。但是还有一个预处理阶段和查询优化器阶段;其实查询优化,就好比是查询执行的路径

  1. 使用等价变化规则

  2. 优化count min max 等函数

  3. 覆盖索引扫描

  4. 子查询优化

  5. 提前终止查询 limit 100

  6. in的优化 【全表扫描】

[执行器] 这基本就是最后阶段了,调用执行引擎。当选择了最有的执行方案或执行路径之后,mysql就会执行你的SQL语句了。

[返回客户端] 最后返回你的就是成功或者失败,以及失败原因


以上是小弟的个人学习,可能会有错或者不对的地方,欢迎大家指正,共同学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值