Mysql流程解析

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语句执行的结果,同时服务端不用存储太多结果而占用过大的内存空间。

原文地址:https://www.cnblogs.com/Rlxy93/p/11966207.html

时间: 2024-09-30 18:55:21

Mysql流程解析的相关文章

SSL/TLS算法流程解析

SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description   Browser Support SSL v2.0 Vendor Standard (from Netscape Corp.) [SSL2] First SSL protocol for which implementations exist - NS Navigator 1.x/2.x - MS

MediaPlayer本地播放流程解析(一)

应用场景: MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.release(); mediaPlayer = null; } }); mediaPlayer.setDataSource("abc.m

MediaPlayer本地播放流程解析(二)

上一篇MediaPlayer本地播放流程解析(一)讲了MediaPlayer的setDataSource流程,本篇将接着讲MediaPlayer的prepare流程. Prepare前面的流程一直到AwesomePlayer,和setDataSource都基本上一样,这里直接略掉.下面将从AwesomePlayer开始. status_t AwesomePlayer::prepare() { ATRACE_CALL(); Mutex::Autolock autoLock(mLock); retu

蓝牙OBEX剖析(二)-- 流程解析

OBEX流程解析(封包格式见上篇文章) 1.连接 2.Get 3.put 4.disconnect

Android 之MediaScanner流程解析

MediaScanner详解 OK, 我们现在开始来大概分析一下android framework中MediaScanner部分的流程,若大家发现分析过程中有错误,欢迎拍砖指正. 分析流程之前,我们先给自己定个要用MediaScanner解决的问题,这样我们才会有目标感,才知道我们要干什么.否则,干巴巴的分析流程,一般都会很容易的迷失在各种code的迷雾中. 我们这里要定的目标是:获取某个MP3文件的artist & album. 我们可以假定,现在有个媒体播放器,在播放music的时候,需要在

linux引导流程解析

三:linux引导流程解析 date 当前系统硬件时钟 hwclock 固件(介于硬件和软件之间的)时钟 ---->一般系统时钟和固件时钟是同步的 hwclock --hctosys 同步时钟 手动修改系统当前时间: date 040617032015.38 (2015-04-06 17:03:38) 手动修改固件时间:(man hwclock可以查看) hwclock --set --date="4/6/15 17:06:40" linux的pc server 一般用的是 CM

mysql流程控制、自定义函数、存储过程

修改结束符dilimiter $$ 分支 if 条件 then 语句 else if 条件 then 语句 else 语句 end if; 循环 while 条件 do 循环体 end while; 用户自定义变量 典型的变量:字段名就是变量,还有一些系统内置的变量 用户自定义变量需要使用 @作为变量名的前缀,用于区分是否是系统内置变量! set 变量名=变量值! //赋值set @height=10; 取值 //select @height; 系统内置函数 rand(),生成随机数的函数,得到

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

知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN statmen_list ; [SLSEIF search_condition THEN statmen_list]; ELSE statmen_list; END IF; 1 --7 流程控制语句之选择语句 2 DELIMITER // 3 CREATE PROCEDURE p_test7(IN

mapreduce(2)--combiner使用和mr流程解析

一.准备工作 1.需求 在wordcount程序中使用自定义combiner 解析mapreduce的流程 2.环境配置 (1)hadoop为本地模式 (2)pom文件代码如下 <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</v