sql的执行过程

MySQL版本基于 5.7

MySQL各个组件的组成以及运行流程介绍
在这里插入图片描述

  • 客户端
    MySQL连接的客户端,列举几种常用的客户端工具

    • MySQL命令行
    • navicate
  • 服务端
    介绍:主要包括连接器、查询缓存、语法解析器、优化器、执行器,以及常用的函数 例:视图,触发器、存储过程,MySQL核心数据服务都在这一层实现。

    • 连接器介绍:

      1.和客户端建立连接

      2.连接器中会有一块缓存存储用户连接时的权限信息,并根据权限信息进行用户权限设置,注意这里在用户更改了权限信息之后不会触发缓存的更新,必须要由连接断开重连后才能使用新的权限信息,可以由用户进行重连也可以在连接超时后自动断开后下次连接。
      使用 show processlist 命令可以查看当前MySQL的连接数以及连接状态(command列)
      在这里插入图片描述
      客户端如果长时间不发送command到server端,连接器会主动东断开连接,默认没有command的最大等待时间为8小时。

      3.长短连接 开发中常用的是长连接,建立一次连接后后面会一直使用这个通道进行数据操作。而短连接则是每次访问数据库都建立一次连接。开发中一般使用连接池进行长连接的管理。但是当长连接时间执行过多的sql时也会产生较大连接对象占用内存,这时就需要我们进行定期的断开长连接。或者执行mysql_reset_connection 进行连接的资源重置,此操作不会刷新的权限内存也不会重新连接。

    • buffer (查询缓存)
      MySQL server层面的的一块缓冲区,其结构类型类似于Map<k,v> k存储的是sql语句 v存储的是sql执行的结果,当sql进入执行器时会先到查询缓存中查找是否存在,存在则直接返回结果。否则进入连入连接器执行下面的操作。再把操作执行完的内容放入查询缓存信息

      执行以下语句查询缓存信息。

      show status like'%Qcache%';
      

      需要注意的是,当一个表的数据被进行了修改,查询缓存中的这个表的数据都会被清空,因此查询缓存使用在读多写少的表更合适如配置表。另外 mysql8.0中已经移除了查询缓存

    • 词法解析器:词法解析器 借鉴这篇文章

    • 优化器:优化器是解析sql语句时帮我们选择使用哪个索引执行sql语句,能达到最高的效率,领外也对我们的sql 本身进行优化 例如优化我们的最左前缀原则 例
      联合索引为 name,age,position 伪sql写为

      select * from tablename where age ='' and  name ='' and position=''; 
      

      优化器会帮我们优化为

      select * from tablename where name ='' and  age ='' and position=''; 
      

      自动排序索引字段

    • 执行器:优化器执行完后MySQL会根据表名进行权限检查,通过才能放行,对于查询缓存的sql语句在返回结果之前也会进行权限校验。

  • 引擎层

    • 引擎层则是由插拔式的设计
    • 引擎层执行流程
      例如我们有一张test表,要查询这个表id为5的数据,id字段没有索引
      1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 5,如果不是则跳过,如果是则将这行存在结果集中。
      2. 调用重复的逻辑进行判断直到表扫描结束。
      3. 执行器会将结果集返回给客户端。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值