一条sql内部是如何执行的:

学习MySQL实战45专栏

sql中的内部执行图:

可以分为两部分:server和存储引擎

server层包含:

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

存储引擎层:

负责数据的存储和提取,存储引擎是可以多选的,支持 InnoDB MyISAM、

Memory 等,现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎

指定存储引擎:engine=memory不同存储引擎的表数据存取方式不同,支持的功能也不同.

select * from T where ID=10;

连接器:

查询缓存:

连接建立后,就可以执行select语句,然后会进行查询缓存,
MySQL收到查询请求后,会到查询缓存中查看,其中都是保存着以key-value形式的键值对,key为查询语句,value为查询结果,如果有缓存则直接返回value。
不在查询缓存中,会执行后续过程,执行完成后会讲查询的结果保存到缓存中;但是查询缓存的弊大于利;

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空

按需设置:

  1. 将参数 query_cache_type 设置成 DEMAND;所有的SQL都不会进行查询缓存
  2. 通过关键字SQL_CACHE 也可以显示指定
mysql> select SQL_CACHE * from T where ID=10;

在MySQL8.0后取消了这个查询缓存的功能;

分析器:

然后对于sql语句进行分析,主要词法分析和语法分析

  1. 把相关的关键字、表名、字段等分析出来
  2. 根据词法分析的结果进行语法规则的判断,不会就会有错误提示You have an error in your SQL syntax,然后看use near后面的信息;

优化器:

通过分析器,MySQL知道了执行目的;主要是决定sql中执行的顺序,

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;
--等价于
select * from ti join t2 where t1.ID = t2.ID and ti.c = 10 and t2.d = 20;

不同的执行顺序,所执行的效率是不一样的;

  • 既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20。
  • 也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。

执行器:

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

在工程实现上,如果命中查询缓存(mysql8已取消),会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限

一条Sql的执行过程的更多相关文章

  1. Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

    Oracle 是如何工作的? Select id,name from t order by id ; – SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限) – 执行计划(OR ...

  2. 一条 sql 的执行过程详解

    写操作执行过程 如果这条sql是写操作(insert.update.delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以 ...

  3. MySql 学习之 一条更新sql的执行过程

    上一篇文章咱们说了一条查询sql的执行过程.如果没有看过上一篇文章的可以去看下上一篇文章,今天咱们说说一条更新sql的执行过程. 上面一条sql是将id为1的分数加上10. 那么它的执行流程是怎样的呢 ...

  4. MySql 学习之 一条查询sql的执行过程

    相信大家都接触过Mysql数据库,而且也肯定都会写sql.我不知道大家有没有这样的感受,反正我是有过这样的想法.就是当我把一条sql语句写完了,并且执行完得到想要的结果.这时我就在想为什么我写这样的一 ...

  5. mybatis源码分析(五)------------SQL的执行过程

    在对SQL的执行过程进行分析前,先看下测试demo: /** * @author chenyk * @date 2018年8月20日 */ public class GoodsDaoTest { pr ...

  6. mysql体系结构和sql查询执行过程简析

    一: mysql体系结构 1)Connectors 不同语言与 SQL 的交互 2)Management Serveices & Utilities 系统管理和控制工具 备份和恢复的安全性,复 ...

  7. 转:Oracle中SQL语句执行过程中

    Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...

  8. 你了解一条sql的执行顺序吗

    sql是后端开发人员经常碰到的问题,我们经常会写这样的sql:select name,id from student where id=12 order by id desc,把这条sql放到数据库中 ...

  9. 如何清除某条SQL的执行计划

    如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(除非alter system flush shared_pool) ...

随机推荐

  1. 学习saltstack (一)

    salt介绍 Salt是一个基础平台管理工具 Salt是一个配置管理系统,能够维护预定义状态的远程节点 Salt是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据 salt的核心功能 是命令 ...

  2. 规范之“用流中的Stream.Of(arr1,arr2)将两个集合合并”

    案例:用流中的Stream.Of(arr1,arr2)将两个集合合并 /** * 功能描述: * 两个对象集合添加到一起 * 在用flatMap扁平化改为Stream<User> * 这样 ...

  3. css布局中左侧固定右侧自适应

    float 单一层浮动法左侧固定成100px; 则核心代码 左侧:width:100px;float:left; 右侧 width:auto;margin-left:100px;绝大浏览器是没有任何问 ...

  4. 什么是RESTFUL?REST的请求方法有哪些,有什么区别?

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [什么是REST ...

  5. 如何使用Flannel搭建跨主机互联的容器网络

    当您将多台服务器节点组成一个Docker集群时,需要对集群网络进行设置,否则默认情况下,无法跨主机容器互联,接下来我们首先分析一下原因. 跨主机容器互联 下图描述了一个简单的集群网络,在该集群内,有两 ...

  6. python-使用函数求余弦函数的近似值

    本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加): cos(x)=0!x0​−2!x2​+4!x4​−6!x6​+... 函数接口定 ...

  7. vue实现省市区三级联动

    npm 安装 npm install v-distpicker --save Vue全局引入组件 import Distpicker from 'v-distpicker' Vue.component ...

  8. String类 的基本用法

    1.String 对象的创建 String对象的创建有两种方式. 第1 种方式就是我们最常见的创建字符串的方式: String str1 = "Hello, 慕课网"; 第 2 种 ...

  9. 1.Java基础

    1.注释 单行注释 // 多行注释 /*回车 文档注释(注解)./**回车 2.标识符 (1)Java所有组成部分都需要名字,类名,变量名以及方法名都称为标识符 (2)且标识符只能以字母.$或者_ 开 ...

  10. Java学习day23

    今天学习了下拉框实现与简单游戏的实现 package com.Cra2iTeT.snake; import javax.swing.*; import java.awt.*; import java. ...