一个sql的执行过程详解
作者:猿来是八阿哥
链接:https://www.jianshu.com/p/e2926d6a808f
一个sql的执行过程
一、 组成部分
PDO_MYSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to MySQL databases.
客户端,如:php 的
pdo_mysql
扩展。MySQL 服务:
server 层,主要包含:连接器、查询缓存、解析器、预处理器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
存储引擎层,主要负责:数据的存储和提取。
二、 大概流程
MySQL server 层的
连接器
对来自客户端的连接进行验证,包含:`用户名密码` 或 `SSL 证书` 验证
`库-database`、`表-table`、`读写权限` 验证
MySQL server 层的
查询缓存
对客户源原始SQL进行缓存命中检测
:命中则直接返回,未命中则进一步执行查询。MySQL server 层的
解析器
对查询语句进行解析,得到查询语句的解析树
。MySQL server 层的
预处理器
对解析树
进一步验证。MySQL server 层的
优化器
将解析树
转化为执行计划
。MySQL server 层的
执行器
通过 API 与底层的存储引擎
进行交互,执行执行计划
。MySQL 存储引擎 层得到执行结果,返回给 MySQL server 层。MySQL server 层将结果交由
查询缓存
进行缓存,并返回给客户端
三、 查询缓存
关键逻辑:
包含 `now()` `current_date()` 等日期函数
包含 `用户自定义函数`、`存储函数` `用户变量` `临时表` 等
涉及 mysql 数据库的表或者字段
`select * from user where id=1;`
`select * from user where id="1";`
`select username from user where id=1;`
`SELECT username FROM user WHERE id=1;`
`查询缓存` 缓存了 `执行计划` 的完整结果,当缓存命中时,直接返回缓存中的结果,从而跳过了 `解析-优化-执行` 的过程。
`查询缓存` 基于不变的表结构和表数据,`当表结构或表数据发生变化时,其表上的所有缓存都将失效`。
`查询缓存` 可以理解将 `执行计划` 的结果缓存在 hashtable 中,key 是 `客户端发来的原始查询sql` 的 hash 值,因此:
的 hash 值并不相同。即:`即使同一条SQL,如果大小写、空格、单引号、双引号、注释等不同,都会使用不同的缓存 key`
[结果不 set 缓存的情况] 当查询语句中包含以下情况是,查询结果不会被缓存:
因为在 `查询缓存` 阶段,还没有进行 `解析器` 解析的工作,因此:`所有查询都会尝试去 get 缓存,但总是不命中`。
相关配置:
如果查询结果比较大,超过了query_cache_min_res_unit的值,MySQL将一边检索结果,一边进行保存结果。
根据自身情况设置合适的大小:太大会造成大量的 `内存碎片`,太小又需要 `频繁的申请内存`。
`have_query_cache`,当前的MYSQL版本是否支持“查询缓存”功能。
`query_cache_limit`,能够缓存的最大查询结果,查询结果大于该值时不会被缓存,默认值是 1MB
`query_cache_min_res_unit`,查询缓存分配的最小块(字节)。默认值是4096(4KB)。
`query_cache_size`,为缓存查询结果分配的总内存。
`query_cache_type`,默认为on,可以缓存除了以 `select sql_no_cache` 开头的所有查询结果。
`query_cache_wlock_invalidate`,如果该表被锁住,是否返回缓存中的数据,默认是关闭的。
优缺点:
对于频繁变动(`修改表结构、新增、删除、修改数据`)的表,由于一旦 `变动` 就会清除该表的所有缓存,导致:命中率极低,每次SQL还增加了 `查询缓存` 的额外工作。
参与 hash 计算的是客户端发来的原始SQL,还未经过 `解析器` 解析,`完全一样` 的sql才能命中缓存。
`查询缓存` 实质上是缓存 `SQL的hash值` 和 `该SQL的查询结果`,省去了大量重复SQL查询的 `解析-优化-执行` 过程。
优点:
缺点:
四、 `解析器` 和 `预处理器`
解析器
和 预处理器
的工作主要包含:
对
原始SQL
进行语法解析,验证语法规则,如:关键字是否正确
关键字顺序是否正确
语句是否有语法错误,如:缺少逗号等
得到 `语法解析树`
进一步验证
语法解析树
,如:库、表是否存在
字段、类型是否正确
是否使用了禁止的关键字等
调用函数、识别别名等
五、 优化器
优化器
是基于Cost-Based Optimizer
模型,预估
每条执行方式的成本
,选择成本最小
的执行方式,转化为执行计划
。选择最优的执行方式
比较好使,优化器
维护了一个执行计划缓存
,当缓存命中时,直接使用上次的执行计划
。每种执行方式的成本
cost
预估包含几个方面:`io_cost`,对IO操作的成本预估
`cpu_cost`,对CPU操作的成本预估
`import_cost`,对远程操作的成本预估
`mem_cost`,对内存消耗的成本预估
Cost-Based Optimizer
对复杂语句的成本预估
会产生偏差,这时候就需要用到我们
了,哈哈。
六、 存储引擎
具体的 执行计划
如何执行,依赖于各种不同的 存储引擎
的索引算法,如:
B-Tree 从根节点开始,沿着向下的指针,找到存储了行数据位置的叶子节点,再判断是否满足
覆盖查询
,访问行数据。Hash 则根据直接计算 hash 值,如果冲突,再遍历链表。
在此不再赘述,可转阅:MySQL之 B-Tree / B+Tree 索引
七、 结果返回客户端
MySQL将结果集返回给客户端是一个 增量、逐步返回
的过程。即:在查询生成第一条结果时,MySQL就可以开始向客户端逐步返回结果集了。
一个sql的执行过程详解相关推荐
- sql server修改字段编码格式_原理:一条 sql 的执行过程详解
思维导航: 写操作执行过程 组件介绍 1.undo log 与 MVCC 2.redo log 与 Buffer Pool 3.bin log(Server 层) 1.连接器 2.缓存(Cache) ...
- MySQL探秘(二):SQL语句执行过程详解
只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化. 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.一旦理解了这一点,很 ...
- mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解
昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化. 当希望MySQL能够以更高的性能运行查 ...
- Hadoop学习之Mapreduce执行过程详解
一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...
- sql语句执行步骤详解
一.准备工作 先来一段伪代码,首先你能看懂么? SELECT DISTINCT <select_list>FROM <left_table><join_type> ...
- statement执行insert into语句_【图文并茂】源码解析MyBatis ShardingJdbc SQL语句执行流程详解...
源码分析Mybatis系列目录: 1.源码分析Mybatis MapperProxy初始化[图文并茂] 2.源码分析Mybatis MappedStatement的创建流程 3.[图文并茂]Mybat ...
- 数据库除关系运算符执行过程详解
数据库除关系运算符案例详解 声明与简介 数据库里的Div(除)运算符是借鉴了数学基本元素除的理念,即整体除以个体,得到组(满足个体的特征的集合). 所以如果"被除数"的集合R有4个 ...
- mysql查询解析过程_MySQL查询执行过程详解
查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...
- SQL底层执行原理详解
我们平时都是使用sql语句去查询数据,都是很直接的看到结果.那么对于sql底层执行的过程大家有了解吗? 一.MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分 ...
最新文章
- 一天1300 Star量,GitHub上新官方命令行工具
- 简单好听的id_一位妈妈给孩子的10大家规,简单实用,值得所有父母借鉴!
- python modbus tk 库_如何使用modbus tk rtu(python)设置简单的从机和主机
- dijkstra算法matlab代码_头脑风暴优化(BSO)算法(附MATLAB代码)
- java继承总结_java继承总结(二)
- 重载-运算符(感觉怪怪的)
- PHP 发送Email的几种方法
- 深入浅出 Java 8 Lambda 表达式
- 关联映射 一对多 实验心得_使用影响映射来帮助您的团队进行实验
- 输入长度_CAD怎么测量长度?
- 使用apache+mod_wsgi方式部署完成后,访问网站时400(Bad Request)
- rust哪里油桶多_我们在说Filecoin的时候为什么要说rust语言
- 高颜值生物医学在线画图工具
- COSNET: Connecting Heterogeneous Social Networks with Local and Global Consistency 论文阅读笔记
- Python数据分析理论与实战完整版本
- bootStrap3 垂直居中
- C++函数的定义与使用
- Julia会是超越Python的存在吗
- 微信小程序 - 数据转excel下载并复制链接
- android开发论坛!关于Android开发的面试经验总结,含爱奇艺,小米,腾讯,阿里
热门文章
- 微信开发者和其他服务器区别,求教微信公众号开发中两种认证技术的区别?
- deepfakes怎么用_如何使用 Deepfakes 换脸
- Linux环境下安装nginx
- 河南城建学院linux期末试题,河南城建学院09-10(上)期末试题.ppt
- mysql中列的增删_mysql中怎么增删一列
- 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)
- iis 无法连接mysql_远程无法连接SQL2000及MySQL的原因和解决办法
- java 组合框_Java知多少(88)列表和组合框
- 任铄 计算机操作系统,计算机组成与体系结构-CSDN.PDF
- java arraylist 当参数_关于java:为什么修改了ArrayList参数,但没有修改String参数?...