Mysql语句执行流程

文章详细阐述了SQL查询语句的执行过程,包括权限校验、查询缓存、分析器、优化器和执行器等步骤。优化器根据SQL选择最佳执行计划,如索引选择、条件重排等。执行器负责权限检查和调用存储引擎。对于更新语句,涉及分析、优化、执行、redolog和binlog记录以保证事务的ACID特性。
摘要由CSDN通过智能技术生成

一条查询sql的执行过程

  • 查询语句执行流程如下: 权限校验(如果命中缓存)–> 查询缓存 —> 分析器 --> 优化器 —> 权限校验 —> 执行器 —> 引擎

    1. 建立连接:客户端通过 TCP 连接发送连接请求到 MySQL 连接器,连接器会对该请求进行权限验 证及连接资源分配

    2. 查询缓存:存在缓存则直接返回,不存在则执行后续操作

      • 之前执行过的语句会以KV的形式缓存在内存中,key 是查询的语句,value 是查询的结果。查询之前先查找之前执行过的相同语句。

      • 不推荐使用缓存:数据表修改后,会删除所有相关缓存

    3. 分析器:对SQL进行词法分析和语法分析操作。

    4. 优化器:根据SQL制定出不同的执行方案,并择选出最优的执行计划。

      • 多条件查询时,重排条件先后顺序,将效率更好的字段条件放在前面。
      • 当表中存在多个索引时,选择效率最高的索引作为本次查询的目标索引。
      • 使用分页Limit关键字时,查询到对应的数据条数后终止扫表。
      • 多表join联查时,对查询表的顺序重新定义,同样以效率为准。
      • 对于sql中使用函数时,根据情况选择最优方案。
        • max()函数:走B+树最右侧的节点查询(大的在右,小的在左)。
        • min()函数:走B+树最左侧的节点查询。
        • count()函数:如果是MyISAM引擎,直接获取引擎统计的总行数。
        • ......
      • 对于group by分组排序,会先查询所有数据后再统一排序,而不是一开始就排序。
    5. 执行器:权限校验,调用存储引擎。

      • 执行器首先校验此用户对目标数据有无权限。

      • 执行器会以行为粒度,调用存储引擎执行SQL,在没有索引的情况下,执行器会循环查询所有行。

  • 更新语句执行流程如下: 分析器 —> 优化器 —> 权限校验 —> 执行器 —> 引擎 —> redo log(prepare) —> binlog —> redo log(commit)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xo9IAL45-1683458325772)(images/image-20230209044452499.png)]

    update tb_employee set level = '5' where name='张三'
    
    • 先查询到张三这一条数据,如果有缓存,也是会用到缓存。

    • 然后拿到记录,把 level 改为 5,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。

    • 执行器收到通知后记录 binlog,然后调用引擎接口,提交 redo log 为提交状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Guanam_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值