JAVA执行过程sql,SQL 执行过程

一、MySQL架构总览:

二、查询执行流程

一条select的生存周期:

流程:

1.连接

1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求;

1.2将请求转发到‘连接进/线程模块’;

1.3调用‘用户模块’来进行授权检查;

1.4通过检查后,‘连接进/线程模块’从‘线程连接池’中取出空闲的被缓存的连接线程和客户端请求对接,如果失败则创建一个新的连接请求;

2.处理

2.1先查询缓存,检查Query语句是否完全匹配,接着再检查是否具有权限,都成功则直接取数据返回;

2.2上一步有失败则转交给‘命令解析器’,经过词法分析,语法分析后生成解析树;

2.3接下来是预处理阶段,处理解析器无法解决的语义,检查权限等,生成新的解析树;

2.4再转交给对应的模块处理;

2.5如果是SELECT查询还会经由‘查询优化器’做大量的优化,生成执行计划;

2.6模块收到请求后,通过‘访问控制模块’检查所连接的用户是否有访问目标表和目标字段的权限;

2.7有则调用‘表管理模块’,先是查看table cache中是否存在,有则直接对应的表和获取锁,否则重新打开表文件;

2.8根据表的meta数据,获取表的存储引擎类型等信息,通过接口调用对应的存储引擎处理;

2.9上述过程中产生数据变化的时候,若打开日志功能,则会记录到相应二进制日志文件中;

3.结果

3.1Query请求完成后,将结果集返回给‘连接进/线程模块’;

3.2返回的也可以是相应的状态标识,如成功或失败等;

3.3‘连接进/线程模块’进行后续的清理工作,并继续等待请求或断开与客户端的连接;

查询缓存(query cache)

在解析一个查询语句之前,如果查询缓存是打开的,那么MySQL会优先检查这个查询是否命中查询缓存中的数据。这个检查是通过一个对大小写敏感的哈希查找实现的。查询和缓存中的查询即使只有一个字节不同,那也不会匹配缓存结果,这种情况查询会进入下一个阶段的处理。

如果当前的查询恰好命中了查询缓存,那么在返回查询结果之前MySQL会检查一次用户权限。这仍然是无须解析查询SQL语句的,因为在查询缓存中已经存放了当前查询需要访问的表信息。如果权限没有问题,MySQL会跳过所有其他阶段,直接从缓存中拿到结果并返回给客户端。这种情况下,查询不会被解析,不用生成执行计划,不会被执行。

语法解析器和预处理器

首先,MySQL通过关键字将SQL语句进行解析,并生成一棵对应的“解析树”。MySQL解析器将使用MySQL语法规则验证和解析查询。例如,它将验证是否使用错误的关键字,或者使用关键字的顺序是否正确等,再或者它还会验证引号是否能前后正确的匹配。

预处理器则根据一些MySQL规则进一步检查解析树是否合法,例如,这里讲检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。

下一步预处理器会验证权限,这通常很快,除非服务器上有非常多的权限设置。

三、SQL解析顺序

SQL语句:

SELECT DISTINCT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT

然而它的执行顺序是这样的:

FROM ON JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY LIMIT

这里配上sql 解析图,很清晰:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 1.8 HashMap源码探究

(#)最近听说1.8的HashMap引入了红黑树做了性能的优化,遂又把出了源码来研究研究(留下口,后面再写)转载于:https://www.cnblogs.com/wscit/p/6730136.html

安装elasticsearch-php,安装 |《Elasticsearch-PHP 中文文档 6.0》| PHP 技术论坛

安装Elasticsearch-php 只有四个要求您需要担心的:PHP 7.0.0 或者更高的版本ext-curl: PHP 的 Libcurl 扩展(参见下面的注释)Native JSON 扩展 (ext-json) 1.3.7 或者更高的版本其余的依赖项将由 Composer 自动下载安装。 Composer 是 PHP 的包和依赖项管理器。通过…

java.io.IOException: DerInputStream.getLength(): lengthTag=111, too big解决方法

1:报错如下 Exception in thread "main" java.io.IOException: DerInputStream.getLength(): lengthTag111, too big.at sun.security.util.DerInputStream.getLength(DerInputStream.java:599)at sun.security.util.DerValue.init(DerValue.java:391)at sun.securit…

ClassLoader.getResourceAsStream(name);获取配置文件的方法

1:报错如下 2:分析 3:解释 使用Spring的ClassPathResource来读取maven项目resource下的文件 一般来说,我们项目的配置文件及静态资源都会放置在resources目录下。有时我们在项目中使用到resources目录下的文件,这时我们可以使用Spring下的Resouce接口来…

matlab msgbox 换行,[转载]Matlab/GUI笔记

转自 http://www.kylen314.com/archives/412不显示坐标刻度:set(gca,xtick,[])频率响应:[H,F]freqz(b,1,512);plot(F,20*log10(abs(H)));滤波:Y Filter(A,B,X);A/B虑X得到Y播放音乐:sound(x,fs)摄像头模块:% 获取摄像…

答CSDN关于建模的系列问题

最近工作一直比较忙,很多想法没时间写下来,最近回复了CSDN杂志社的一系列相关的建模问题,顺便贴在这里,欢迎大家讨论。 以下是我对建模的一些看法 1 你怎么看待建模?作为一个程序员,可能每个人都经历过这样…

sqlserver操作geography方法

--总表面积SELECT geography::STGeomFromText(POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653)), 4326).STArea() --二进制(WKB)表示形式SELECT geography::STGeomFromText(LINESTRING( -122.360 47.65…

ClassPathResource使用简介

ClassPathResource使用简介 使用Spring的ClassPathResource来读取maven项目resource下的文件 一般来说,我们项目的配置文件及静态资源都会放置在resources目录下。有时我们在项目中使用到resources目录下的文件,这时我们可以使用Spring下的Resouce接口来…

用matlab画阻尼振动包络线,matlab阻尼振动模拟.doc

matlab阻尼振动模拟matlab阻尼振动模拟班级 应数0801 姓名 翟伟西 学号 u座机电话号码5实验目的通过这个实验能更好的了解学习matlab程序语言,了解matlab在仿真方面的应用实验原理通过把做阻尼振动的小球的运动作投影,更好的观察在阻尼振动过程中&#x…

编写高性能的托管应用程序:入门

编写高性能的托管应用程序:入门 发布日期: 6/15/2004 | 更新日期: 6/15/2004 Gregor Noriskin Microsoft CLR 性能小组 适用于:Microsoft .NET 框架 摘要:从性能的角度来学习 .NET 框架公共语言运行库。学习如何找出托…

[No0000E6]C# 判断与循环

判断语句 语句描述if 语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。if...else 语句一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。嵌套 if 语句您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。switc…

关于Class.getResource和ClassLoader.getResource的路径问题

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。 Class.getResource(String path) path不以’/开头时,默认是从此类所在的包下取资源; path 以’/开头时&…

php ci post 请求,ci检测是ajax还是页面post提交数据的方法

ci检测是ajax还是页面post提交数据的方法PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用。以下是小编为大家搜索整理的ci检测是ajax还是页面post提交数据的方法&#xff…

db2系统表相应功能

SYSIBM: 基本系统编目,不建议直接访问SYSCAT: 默认授权给Public组.只读编目视图,一般通过这个来获取编目信息SYSSTAT: 可更新编目视图,会影响优化器的优化策略SYSFUN: 用户定义函数SYSPROC: 存放一组系统的存储过程如果你需要知道具体的每个编目表所产生的作用,可以去info cent…

怎么博客圆的文章越来越杂?

最近发现怎么博客圆的文章越来越杂?PHP,JAVA等非.NET技术也来拉好象博客圆现在不是一个纯.NET社区拉管理员是不是该采取一些手段来防止这种现象的扩大

idea 快捷键获取类的全限定类名(包名+类名)

什么是全限定类名:就是 包名类名 1:选中一个类名,然后右键 Copy Reference 2:点击paste without Formatting 3:查看结果

java additem 错,Java错误:IllegalArgumentException:向容器添加窗口

我一直收到错误:Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a containerat java.awt.Container.checkNotAWindow(Container.java:483)at java.awt.Container.addImpl(Container.java:1084)at java.awt.Containe…

今天狂想自杀,找了两个星期的工具,原来我已经有了。

人爱偷懒,没办法。上网时,偶然间,发现了一个叫ReSharper的工具,这个东西的虽然支持重构,据大家的介绍,但功能不是很强,但我偶然发现里面的live template功能,可以极大地提高编程的效…

UICollectionView——整体总结

前言 这几天有时间看了下UICollectionView的东西,才发觉它真的非常强大,很有必要好好学习学习。以前虽然用过几次,但没有系统的整理总结过。这两天我为UICollectionView做一个比较全面的整理。包括基本使用,自定义布局&#xff0c…