【基础篇】基础架构:一条 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 并不是完全相同的。
相关推荐
NCIN EXPE3 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台3 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路3 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家3 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE3 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow123 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO3 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623923 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele3 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python