当前位置: 首页 > news >正文

Mysql查询语句的运行流程

我们先看一下MYsql的基本架构示意图:

大体来说,MySQL 可以分为 Server 层存储引擎层两部分。

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核
心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引
擎的功能都在这一层实现,比如存储过程、触发器、视图等。

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、
MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL
5.5.5 版本开始成为了默认存储引擎。

 

现在我们来详细看一下查询sql的执行流程:

连接器

第一步,你会先连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端
建立连接、获取权限、维持和管理连接。

如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户
端程序结束执行。
如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接
里面的权限判断逻辑,都将依赖于此时读到的权限。

查询缓存

连接建立完成后,你就可以执行 select 语句了。

执行逻辑就会来到第二步:查询缓存。

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。

但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于
利。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清
空。

需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻
底没有这个功能了。

分析器

如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什
么,因此需要对 SQL 语句做解析。

分析器先会做“词法分析”。你输入的是由多个字符串和空格组成的一条 SQL 语句,
MySQL 需要识别出里面的字符串分别是什么,代表什么。

做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语
法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。

优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处
理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联
(join)的时候,决定各个表的连接顺序。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行
器阶段,开始执行语句。

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用
这个引擎提供的接口。
比如我们这个例子中的表 T 中,ID 字段没有索引,那么执行器的执行流程是这样的:
1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如
果是则将这行存在结果集中;
2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
至此,这个语句就执行完成了。

转载于:https://www.cnblogs.com/lamp01/p/10735481.html

相关文章:

  • 跑步书籍推荐 --- 跑步指南
  • 2019阿里云企业服务器配置选择教程!【 可供新手小白参考】
  • CSS文本超出2行就隐藏并且显示省略号
  • “打开潜意识 拥抱心灵智慧” 51CTO心理师线下沙龙课北京站
  • 生成树协议(STP)
  • Robust PCA via Outlier Pursuit
  • JavaScript 设计模式之策略模式
  • SpringSocial相关的知识点
  • 移动端长按事件
  • 浅克隆和深克隆
  • (一)appium-desktop定位元素原理
  • 解密虚拟 DOM——snabbdom 核心源码解读
  • Python基础之列表
  • MyBatis配置多数据源
  • Asp.net core Identity + identity server + angular 学习笔记 (第三篇)
  • hexo+github搭建个人博客
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • angular学习第一篇-----环境搭建
  • ES6--对象的扩展
  • iOS 系统授权开发
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • IP路由与转发
  • JavaScript学习总结——原型
  • jquery ajax学习笔记
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Median of Two Sorted Arrays
  • React-Native - 收藏集 - 掘金
  • SQLServer插入数据
  • uva 10370 Above Average
  • VuePress 静态网站生成
  • vue学习系列(二)vue-cli
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 试着探索高并发下的系统架构面貌
  • 数据仓库的几种建模方法
  • 新书推荐|Windows黑客编程技术详解
  • 鱼骨图 - 如何绘制?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 数据库巡检项
  • ​Python 3 新特性:类型注解
  • # Maven错误Error executing Maven
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###项目技术发展史
  • #if 1...#endif
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (11)MSP430F5529 定时器B
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实战篇)如何缓存数据
  • .NET 3.0 Framework已经被添加到WindowUpdate