【基础篇】基础架构:一条 SQL 查询语句时如何执行的?

一条 SQL 的执行过程

MySQL 架构

在这里插入图片描述

过程分析

  1. 先连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接

    • 输入连续信息之后,会对用户、密码进行权限校验
    • 客户端连接成功之后,会按 wait_timeout 自动将其断开
    • 因为建立连接的过程通常是比较复杂的,所以尽量使用长连接。但是使用长连接,会导致 MySQL 内存涨的特别快,这是因为 MySQL 执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候才释放。一直累积的话,会导致内存占用太大,被系统强行杀掉(OOM),现象就是 MySQL 异常重启了。
      • 定期断开长连接
      • MySQL 5.7 之后的版本,每次执行一个比较大的操作之后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限校验,会将连接恢复到刚刚创建完成时的状态。
  2. 连接建立完成之后,来到第二步:查询缓存

    • 之前执行过这条语句,语句和结果可能会以 key-value 对的形式,直接缓存在内存中
    • 如果能直接查询到,那么就直接返回了。没有的话,执行完成后,会将执行结果存入查询缓存

注:但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。

  • 因为查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空
  • MySQL 8.0 版本直接将查询缓存的整块功能删掉了
  1. 第三步,分析器进行**“词法分析”:是查询还是更新、表名是哪个、列名是哪个。随后进行“语法分析”**:进行 MYSQL 语法检查
  2. 经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序
  3. 接下来,进入执行器阶段:先判断一下你对这个表 T 有没有执行查询的权限(查询也会在优化器之前调用 precheck 验证权限)。
    • 第一次调用的是“取满足条件的第一行”这个接口,如果不是则跳过,如果是则将这行存在结果集中;
    • 之后循环取“满足条件的下一行”这个接口;
    • 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。(有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jiangw557

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

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

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

打赏作者

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

抵扣说明:

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

余额充值