【基础篇】基础架构:一条 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 并不是完全相同的。
相关推荐
Edingbrugh.南空44 分钟前
Flink SQLServer CDC 环境配置与验证
数据库·sqlserver·flink
码不停蹄的玄黓1 小时前
MySQL分布式ID冲突详解:场景、原因与解决方案
数据库·分布式·mysql·id冲突
爱上语文1 小时前
Redis基础(6):SpringDataRedis
数据库·redis·后端
Java初学者小白2 小时前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
丶意冷3 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
时序数据说5 小时前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
戒不掉的伤怀5 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql
cv高级工程师YKY5 小时前
服务器 - - QPS与TPS介绍
数据库
nbsaas-boot5 小时前
高可扩展属性建模设计:架构师的全局思考与落地方案
数据库
爱上语文5 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端