Mysql流程解析

流程图

流程图解析

客户端发送一条sql语句。

1、此时,mysql会检查sql语句,查看是否命中缓存,如果命中缓存,直接返回结果,不继续执行。没有命中则进入解析器。

2、解析器会检查sql语句的语法,并生成一个解析树。

3、预处理器会检查解析树的表名,列名等是否正确,表是否有权限等。

4、当解析树是一个合法的了,优化器将其转化成执行计划,一个解析树有多个执行计划,但是都返回同样的结果,唯一不同的是,每个执行计划的成本不一样,mysql会选择一个最低成本的执行计划来执行。

5、查询执行引擎解析执行计划,通过调用相应的存储引擎的接口来完成,最终返回sql的结果,如果缓存开启,那么将结果也存储到查询缓存中。

1、查询缓存

①解析器解析sql语句之前,会先查看这条sql语句是否命中缓存的数据,如果缓存中有数据,则会检查权限之后返回数据。

②mysql将缓存存在一个表中,通过一个哈希算法的索引来检查是否命中缓存。这个哈希算法包括查询的sql语句本身、要查询的数据库,客户端协议版本号等一系列可能影响查询结果的信息计算出来的,所以如果sql语句有一个字符不相同,都不会命中缓存

③如果查询中含有自定义函数,存储过程,变量,临时表等,不会进行缓存,因为这些属于变量,在上面提到,如果不相同不会命中缓存。比如now(),current_date()等函数。

④如果表的结构或数据发生变化,那么这张表的所有缓存都会失效。因为缓存的数据在表中会被修改,会导致缓存和表不一致。所以在进行写操作时,写入后,对应的表的缓存都会失效。

⑤如果缓存太大或者缓存碎片太多,会导致系统性能下降,并且参考第④点,所以mysql默认不开启缓存。

mysql> show variables like "%query_cache%";
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| have_query_cache             | YES     |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | OFF     |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
6 rows in set

2、解析器

解析器会将一条sql语句解析成一个解析树。

比如

select username from ADMIN;

先通过词义解析,会将这条sql语句解析成

关键字 非关键字 关键字 非关键字
select username from ADMIN

然后通过语义解析

3、预处理器

通过预处理器,会判断解析树的表名,字段名或表的权限是否符合要求。

4、查询优化器

通过预处理器后,解析树便是合法的了。于是查询优化器将解析树转换成执行计划,一个解析树可以转换成多个执行计划,但是它们的最终结果都是一样的。mysql的查询优化器会计算每个执行计划的成本,最终选择最低成本的执行计划来执行。

最低成本通常认为是时间最短,但是mysql不这么认为,它是选择成本小的,成本小≠时间短。

mysql的一些优化策略

①重新定义表的关联顺序。

​ 进行多表关联操作时,mysql不一定按照sql语句中的表的顺序执行,它使用了一些技巧来关联。

②优化min()和max()函数。

​ 查找某列的最大或最小值时,如果该列有索引,只需要查找最左端或最右端。

③提前终止查询。

​ 使用limit时,如果查找到了满足数量的结果,就终止查询。

④优化排序。

​ 老版本中会进行两次传输排序(先读取行指针和排序字段在内存中进行排序,然后根据排序的结果去寻找数据),新版本中只需单次传输排序(先一次性把所有数据读取,再进行排序)。

5、查询执行引擎

查询执行引擎会解析执行计划,然后调用相应的存储引擎的接口来完成sql语句里的操作。

6、返回结果

将结果返回给客户端,即便里面没有行数据,也会返回一些信息,比如执行时间,影响行数。如果开启了缓存,同时也会将结果存入缓存中。

返回客户端是一个增量并逐步返回的过程,有可能在mysql查询到了第一条结果时就开始返回。这样做的好处是能够让客户端第一时间接收到sql语句执行的结果,同时服务端不用存储太多结果而占用过大的内存空间。

Mysql流程解析的更多相关文章

  1. TCP/IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

  2. SSL/TLS算法流程解析

    SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...

  3. TCP/IP协议三次握手与四次握手流程解析(转载及总结)

    原文地址:http://www.2cto.com/net/201310/251896.html,转载请注明出处: TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式  TCP/IP协议的详 ...

  4. Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析

    一.一个请求来到Django 的生命周期   FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...

  5. [MapReduce_3] MapReduce 程序运行流程解析

    0. 说明 Word Count 程序运行流程解析 &&  MapReduce 程序运行流程解析 1. Word Count 程序运行流程解析 2. MapReduce 程序运行流程图

  6. MySQL Binlog 解析工具 Maxwell 详解

    maxwell 简介 Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis.RabbitMQ.Redis.Goog ...

  7. HBase - 数据写入流程解析

    本文由  网易云发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松 ...

  8. MYSQL进阶学习笔记三:MySQL流程控制语句!(视频序号:进阶_7-10)

    知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN ...

  9. EurekaClient自动装配及启动流程解析

    在上篇文章中,我们简单介绍了EurekaServer自动装配及启动流程解析,本篇文章则继续研究EurekaClient的相关代码 老规矩,先看spring.factories文件,其中引入了一个配置类 ...

随机推荐

  1. 《代码大全2》读书笔记 Week8

    这一周博主阅读了<代码大全2>第11章至第13章,第三部分——"变量"就结束了,第四部分作者将转入语句的讨论. 第十一章作者详细阐述了变量名的有效命名规则,第十二和十三 ...

  2. layout(布局)组件

    一.依赖于 Panel(面 板)组件和 resizable(调整大小)组件. 二.class加载方式    <div id="box" class="easyui- ...

  3. Stm32CubeMX5 配置 外部中断

    实验使用连接PA8引脚的按键触发中断,外部中断使用双边沿触发,这样就可以检测按键按下与松开,当按键按下时点亮LED, 当按键松开是关闭LED,在中断服务函数中只置位相应的标志,在main函数中具体处理 ...

  4. AtCoder ABC 131F Must Be Rectangular!

    题目链接:https://atcoder.jp/contests/abc131/tasks/abc131_f 转自博客:https://blog.csdn.net/qq_37656398/articl ...

  5. css 实现文本换行及显示不下隐藏显示省略号

    CSS文本超出2行就隐藏并且显示省略号 转载:https://www.cnblogs.com/wyaocn/p/5830364.html   今天做东西,遇到了这个问题,百度后总结得到了这个结果. 首 ...

  6. Magento站点优化方案

    Magento 是一个开源电子商务系统,尤其以扩展性高著称,但是很高的扩展性往往是牺牲了速度为代价的,虽然现在magento为速度提升做了很多工作,但是还是没能达到人们对速度的要求.既然如此还是很自然 ...

  7. PHP FILTER_VALIDATE_EMAIL 过滤器

    定义和用法 FILTER_VALIDATE_EMAIL 过滤器把值作为 e-mail 地址来验证. Name: "validate_email" ID-number: 274 实例 ...

  8. 学 Win32 汇编[20]: 洞察标志寄存器

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向 ...

  9. linux find相关 (持续更新中)

    按名字查找 find . -name *.txt find . -name test* # . 指的是当前路径, 查找全局的话把. 换成/ 查找并删除多个文件 find -type f -name & ...

  10. JAVA中 成员变量和和实例变量区别

    java语言支持的变量类型 类变量:独立于方法之外的变量,用 static 修饰. 局部变量:类的方法中的变量. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. publi ...