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

  • 一条SQL查询语句是如何执行的?

    • 大体上MySQL分为Server层和存储引擎层
      • Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大部分核心功能
      • 存储引擎层负责数据的存储和提取,目前常用的存储引擎是InnoDB,是目前MySQL的默认存储引擎,建表时可以指定存储引擎
    • SQL语句的查询过程
      • 首先通过连接器连接到数据库,经过三次握手的TCP连接过程之后,连接器会对账户密码进行认证,如果认证通过连接器就会到权限表查询账户所具有的权限,否则认证失败,连接器负责与客户端建立连接、获取权限、维持和管理连接 【修改用户的权限不对已建立的连接生效】
      • 连接建立之后,MySQL收到一个查询请求,会先去查询缓存【key-value形式保存之前的查询语句和结果】,命中则直接返回,后续步骤不再执行。如果没有命中缓存,那么分析器接着进行词法分析,比如SQL语句中的字符串分别代表什么,如果语法不对,那么会报语法错误【tip:SQL语句报错,关注紧接着use near的内容】
      • 语法分析之后,MySQL就知道你的这行语句需要做什么,而优化器此时会对SQL进行优化,比如索引的选择,连表时的连表顺序【左连还是右连,两者效率不同】
      • 然后执行器在执行之前,会去查询你的账户所具有的权限,有权限则返回结果,无权限则返回错误【如果是查询缓存,结果返回之前也会进行权限的验证】
        • 通过show processLIst可以看到连接的状态以及连接的保持时间
        • 长连接和短连接
          • 前者客户端持续使用一个连接
          • 后者客户端仅使用该连接进行短暂的几次查询就断开连接,下次需要就再建立连接
            • 为什么建立使用长连接?
              • 连接建立的过程比较复杂,消耗资源和时间
            • 为什么不都用长连接?有时MySQL占用内存涨得很快?
              • 因为MySQL执行过程中占用的内存是管理在连接对象中,这些资源只有在连接断开才会释放,如果长连接累积下来,使得内存占用太大,可能会导致MySQL异常重启
        • 查询缓存
          • 为什么不建议使用查询缓存?
            • 利大于弊
            • 因为一旦表修改过,缓存清空意味着缓存失效了,这对经常频繁需要对表进行修改的操作命中率非常低,除非你的业务有一张静态表,一般不怎么执行修改的操作,比如系统配表,那么这时可以建立查询缓存【使用查询缓存可以在执行SQL时声明,默认不走缓存,8.0开始MySQL已经将查询缓存的功能删除了】
        • 不走索引走的是全表扫描,走索引的是仅对"满足条件的结果"进行扫描
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_40396568

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

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

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

打赏作者

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

抵扣说明:

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

余额充值