1.一条SQL查询语句是如何执行的?【中高频】

查询语句执行流程

主要是在server层的操作:

  • 第一步是 连接器

    • 服务器与客户端进行 TCP 三次握手建立连接;

    • 校验客户端的 用户名和密码,如果用户名或密码不对,则会报错;

    • 如果用户名和密码都对了,会读取该用户的权限,然后 后面的权限逻辑判断都基于 此时读取到的权限;

  • 第二步是 查询缓存

    • 如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据,看看之前有没有执行过这一条命令。这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。

    • 但是如果表更新比较频繁,查询缓存的命中率很低的,因为只要表被更新了,那么这个表的查询缓存就会被清空。所以,MySQL 8.0 版本直接将查询缓存删掉了

  • 第三步是 解析SQL

    • 这个工作交由「解析器」来完成,解析器会做如下两件事情:

      • 第一件事情,词法分析:MySQL 会根据你输入的字符串识别出关键字

      • 第二件事情,语法分析。根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树

  • 第四步是 执行SQL

    • 预处理阶段

      • 检查 SQL 查询语句中的表或者字段是否存在

      • 如果语句中有*号的话,将 select * 中的 * 符号,扩展为表上的所有列

    • 优化阶段

      • 这个工作交由「优化器」来完成,主要负责确定 SQL 查询语句的执行计划,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引

    • 执行阶段

      • 这个工作是由「执行器」完成的。执行器会根据执行计划,与存储引擎进行交互,也就是通过接口与存储引擎通信。当然,这个交互是以记录为单位的

【注】

存储引擎本身是一个比较单纯的服务组件,它只负责 数据的读取和存储,而这一切的读写行为都是按照Server层提供执行计划来实施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值