【基础篇】基础架构:一条 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 并不是完全相同的。
相关推荐
ademen39 分钟前
spring第9课,spring对DAO的支持
java·数据库·spring
Java小白程序员44 分钟前
SQL 语句进阶实战:从基础查询到性能优化全指南
数据库·sql·性能优化
君不见,青丝成雪1 小时前
Hadoop技术栈(四)HIVE常用函数汇总
大数据·数据库·数据仓库·hive·sql
不羁。。7 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
yangchanghua1118 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance8 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai8 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白8 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务9 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂12 小时前
MVCC初学demo(一
数据库·后端·mysql