一 MySql架构图

1.2 执行步骤:
1.客户端发送查询语句给服务器
2 服务器首先检查缓存中 是否存在该查询,若存在,返回缓存中存在的结果
不存在 执行下一步
3服务器进行sql解析 语法检测 和预处理 再由优化器生成对应的执行计划
4 mysql的执行根据优化器生成的执行计划执行 调用存储引擎的接口进行查询
5 服务器将查询结果返回客户端
1.3 执行流程


二 Mysql实操
2.1. 新建一个表
DROP TABLE IF EXISTS User;
CREATE TABLE User (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(10) DEFAULT NULL,
age int DEFAULT 0,
address varchar(255) DEFAULT NULL,
phone varchar(255) DEFAULT NULL,
dept int,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8;

// 并初始化数据,如下
INSERT INTO User(name,age,address,phone,dept)VALUES(‘张三’,24,‘北京’,‘13265543552’,2);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘张三三’,20,‘北京’,‘13265543557’,2);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘李四’,23,‘上海’,‘13265543553’,2);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘李四四’,21,‘上海’,‘13265543556’,2);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘王五’,27,‘广州’,‘13265543558’,3);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘王五五’,26,‘广州’,‘13265543559’,3);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘赵六’,25,‘深圳’,‘13265543550’,3);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘赵六六’,28,‘广州’,‘13265543561’,3);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘七七’,29,‘广州’,‘13265543562’,4);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘八八’,23,‘广州’,‘13265543563’,4);
INSERT INTO User(name,age,address,phone,dept)VALUES(‘九九’,24,‘广州’,‘13265543564’,4);
2.2 执行连接器
开始执行这条sql时,会检查该语句是否有权限,若是没有权限就直接返回错误信息,有权限会进行下一步,校验权限的这一步是在图一的连接器进行的,对连接用户权限的校验。
2.3.执行检索内存加粗样式
相连建立之后,履行查询语句的时候,会先行检索内存,Mysql会先行冗余这个sql与否履行过,以此Key-Value的形式平缓适用内存中,Key是检索预定,Value是结果集。
假如内存key遭击中,便会间接回到给客户端,假如没命中,便会履行后续的操作,完工之后亦会将结果内存上去,当下一次进行查询的时候也是如此的循环操作。
2.4.执行分析器
分析器主要有两步:(1)词法分析(2)语法分析

词法分析主要执行提炼关键性字,比如select,提交检索的表,提交字段名,提交检索条件。语法分析主要执行辨别你输出的sql与否准确,是否合乎mysql的语法。

当Mysql没有命中内存的时候,接着执行的是 FROM student 负责把数据库的表文件加载到内存中去,WHERE age< 60,会把所示表中的数据进行过滤,取出符合条件的记录行,生成一张临时表,如下图所示。

GROUP BY dept 会把上图的临时表分成若干临时表,切分的过程如下图所示:


查询的结果只有部门2和部门3才有符合条件的值,生成如上两图的临时表。接着执行SELECT后面的字段,SELECT后面可以是表字段也可以是聚合函数。
这里SELECT的情况与是否存在GROUP BY有关,若是不存在Mysql直接按照上图内存中整列读取。若是存在分别SELECT临时表的数据。

最后生成的临时表如下图所示:

紧接着执行HAVING num>2过滤员工数小于等于2的部门,对于WHERE和HAVING都是进行过滤,那么这两者有什么不同呢?
第一点是WHERE后面只能对表字段进行过滤,不能使用聚合函数,而HAVING可以过滤表字段也可以使用聚合函数进行过滤。

第二点是WHERE是对执行from USer操作后,加载表数据到内存后,WHERE是对原生表的字段进行过滤,而HAVING是对SELECT后的字段进行过滤,也就是WHERE不能使用别名进行过滤。

因为执行WHERE的时候,还没有SELECT,还没有给字段赋予别名。接着生成的临时表如下图所示:

最后在执行ORDER BY后面的排序以及limit0,2取得前两个数据,因为这里数据比较少,没有体现出来。最后生成的结果也是如上图所示。接着判断这个sql语句是否有语法错误,关键性词与否准确等等。
2.5 执行优化器

查询优化器会将解析树转化成执行计划。一条查询可以有多种执行方法,最后都是返回相同结果。优化器的作用就是找到这其中最好的执行计划。

生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。如果在一条SQL语句执行的过程中将该语句对应的最终执行计划进行缓存。

当相似的语句再次被输入服务器时,就可以直接使用已缓存的执行计划,从而跳过SQL语句生成执行计划的整个过程,进而可以提高语句的执行速度。

MySQL使用基于成本的查询优化器。它会尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最少的一个。
执行执行器

由优化器生成得执行计划,交由执行器进行执行,执行器调用存储引擎得接口,存储引擎获取数据并返回,结束整个查询得过程。

这里之讲解了select的过程,对于update这些修改数据或者删除数据的操作,会涉及到事务,会使用两个日志模块,redo log和binlog日志。具体对这两个日志的介绍请看着一篇文章[深入mysql的innodb存储引擎之文件结构]。

以前的Mysql的默认存储引擎MyISAM引擎是没redo log的,而现在的默认存储引擎InnoDB引擎便是透过redo 复杂度来拥护事务的,保证事务能够准确的回滚或者提交,保证事务的ACID。

MySql系列之mysql查询执行过程(附Mysql架构图及实操解析)相关推荐

  1. mysql查询解析过程_MySQL查询执行过程详解

    查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...

  2. mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程

    一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...

  3. 《MySQL DBA修炼之道》——1.3 查询执行过程概述

    本节书摘来自华章出版社<MySQL DBA修炼之道>一书中的第1章,第1.3节,作者:陈晓勇,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.3 查询执行过 ...

  4. MySql免安装版安装配置,附MySQL服务无法启动解决方案

    MySql免安装版安装配置,附MySQL服务无法启动解决方案 参考文章: (1)MySql免安装版安装配置,附MySQL服务无法启动解决方案 (2)https://www.cnblogs.com/jp ...

  5. 用Dockerfile构建MySQL镜像并实现容器启动过程中MySQL数据库系统的初始化

    前一段时间就在研究用Dockerfile构建MySQL镜像并实现容器启动过程中MySQL数据库系统的初始化,但被一些无关紧要的事儿给耽误了,经过查阅<dockerfile最佳实践>及MyS ...

  6. 【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析

    MySQL的发展历史和版本分支: 时间 里程碑 1996 年 MySQL1.0 发布.它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具. 1996 年 10 月 ...

  7. MySQL总结(四)——MySQL中sql语句的执行过程

    MySQL 基本架构 连接器: 身份认证和权限相关(登录 MySQL 的时候). 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用). 分析器: 没有 ...

  8. SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏

    文章目录 1.聚合函数介绍 2.五个常用聚合函数 3.GROUP BY 4.HAVING 5.SELECT的执行过程 1.聚合函数介绍 聚合函数作用于一组数据,并对一组数据返回一个值.聚合函数不能嵌套 ...

  9. mysql root用户可以同时几个人连接_重学MySQL系列(四):10分钟快速掌握MySQL用户与权限管理

    在这篇文章中,我们来聊聊怎么管理MySQL的用户及如何为不同用户分配不同的管理权限,其实,在日常使用MySQL的过程中,这部分的工作是由DBA(数据管理员)来完成的. 而我们作为一般的开发人员,只要拿 ...

最新文章

  1. 比Keras更好用的机器学习“模型包”:无需预处理,0代码上手做模型
  2. 微信小程序 = 滚动页面
  3. Chapter 2 Open Book——34
  4. 日志库EasyLogging++学习系列(11)—— 共享日志库
  5. android保持数据库,android – 保持Firebase实时数据库中的数据始终保持同步
  6. [原创 - 尚学堂科技 - 马士兵老师]
  7. css rem 大屏开发_px/em/rem的区别与应用
  8. 485. 最大连续1的个数 golang
  9. QML程序发布时无法正常运行的解决办法
  10. swift 选中长按项_Swift下使用UICollectionView 实现长按拖拽功能
  11. 树莓派安装python2.7_树莓派3 + raspbian lite + OpenCV 3 环境搭建
  12. [Groovy] How to check if element in groovy array/hash/collection/list?
  13. Arcgis javascript那些事儿(十七)——地理编码服务的发布与使用
  14. SQL查询语句精华使用简要
  15. 彻底搞懂“红黑树”......
  16. 使用EditPlus运行C/C++
  17. zmodem transfer cancled by remote side 解决办法
  18. office相关文件转pdf的几种方式
  19. opencv-python学习笔记-2对比度增强——研0基础学习
  20. 世界杯海信再出圈,三星:“谈不上愉悦”

热门文章

  1. 音频和语音处理领域CCF期刊和杂志
  2. Ubuntu-20.04-live-server无人值守安装
  3. Node 之父 Ryan Dahl说:Node 失误太多无力回天,Deno 前景明朗。NodeJS要完蛋吗?
  4. 365天挑战LeetCode1000题——Day 120 基于时间的最大报酬问题模板
  5. 软件加密技术和注册机制加密基础(转)
  6. Django框架初体验(二)
  7. df和du显示的磁盘空间使用情况不一致的原因及处理
  8. oracle 查看scott权限,Oracle创建表空间、创建用户以及授权、查看权限 、scott解锁...
  9. C语言实现超长整数减法
  10. 2天让你从零基础到手握3-5生信热点分文章 线上课程8月7-8日