【基础篇】基础架构:一条 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 并不是完全相同的。
相关推荐
数据知道29 分钟前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075329 分钟前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha30 分钟前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_35 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance41 分钟前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋1 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.1 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82182 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
大巨头2 小时前
sql2008 数据库分页语句
数据库
m0_715575342 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python