执行一条 select 语句,期间发生了什么

一、执行一条 select 语句,期间发生了什么?

查询语句执行流程

1. 连接器

  • 与客户端建立连接(TCP,三次握手)

  • 校验客户端的用户名和密码

  • 读取用户权限,后面的逻辑判断都基于此处的权限

2. 查询缓存

  • <key, value> == <SQL查询语句,查询结果>

  • 对于一个表,只要有更新操作,就清空这张表的查询缓存,所以查询缓存比较鸡肋

  • 可以通过将参数 query_cache_type 由 ON 设置为 OFF 或者 DEMAND

  • 这里说的查询缓存是 server 层的,不是 Innodb 存储引擎中的 buffer pool

3. 解析 SQL – 解析器

  • 词法分析,识别关键词

  • 语法分析,构建语法树

  • 解析器只是负责检查语法和构建语法树,不负责检查表或字段是否存在

4. 执行 SQL

预处理器–prepare

  • 检查表或字段是否存在

  • 扩展 select * 中的 *

优化器–optimize

  • 确定执行方案,如选择索引

执行器–execute

  • 对于在索引中包含的字段的判断,从执行器下推到执行引擎,减少了回表操作
  • 在MySQL数据库中,show processlist 的结果中出现的 Id 是怎么分配的,为什么只有一个连接的时候Id为2,而不是1?

    • 在MySQL中,连接ID为1通常会保留用于特殊用途,比如主线程或系统线程。因此,第一个分配给客户端的连接ID通常是2。这是出于系统设计和管理的考虑,以便将主要的系统任务与普通客户端连接区分开来。

参考

执行一条 select 语句,期间发生了什么? | 小林coding

相关推荐

  1. 执行 npm run serve 时发生什么

    2024-07-14 20:38:04       32 阅读
  2. MySQL中更新语句是怎么执行的?

    2024-07-14 20:38:04       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 20:38:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 20:38:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 20:38:04       57 阅读
  4. Python语言-面向对象

    2024-07-14 20:38:04       68 阅读

热门阅读

  1. 单元化(Cell Sharding)

    2024-07-14 20:38:04       21 阅读
  2. 网络安全-网络设备及其配置1

    2024-07-14 20:38:04       21 阅读
  3. C++指针

    2024-07-14 20:38:04       23 阅读
  4. Tensor-LLM简单介绍

    2024-07-14 20:38:04       22 阅读
  5. cosyvocie 自回归模型忽大忽下问题解决方案

    2024-07-14 20:38:04       19 阅读
  6. k8s之client-go:golang与k8s交互的桥梁

    2024-07-14 20:38:04       23 阅读
  7. 使用harbor作为chart仓库实现内网部署

    2024-07-14 20:38:04       19 阅读
  8. uniapp使用微信登录

    2024-07-14 20:38:04       19 阅读
  9. git patch怎么使用?

    2024-07-14 20:38:04       20 阅读
  10. git 分支介绍

    2024-07-14 20:38:04       20 阅读