大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
品牌型号:华为MateBook D15
榆阳ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
系统:Windows 11
select语句执行的结果是表。select语句目的,就是从数据库检索,统计,输出数据。select 语句的执行过程,根据查询的内容数据,组成一个结果集,然后用表的形式返回。所以执行结果是一张表。
select语句的执行流程:
1、通过客户端/服务器通信协议与MySQL建立连接。
2、查询缓存,这是 MySQL的一个可优化查询的地方,如果开启了Query Cache且在查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启Query Cache或者没有查询到完全相同的SQL语句则会由解析器进行语法语义解析,并生成解析树。
3、预处理器生成新的解析树。
4、查询优化器生成执行计划。
5、查询执行引擎执行SQL语句,此时查询执行引擎会根据SQL语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互情况,得到查询结果,由MySQL Server过滤后将查询结果缓存并返回给客户端。若开启了Query Cache,这时也会将SQL语句和结果完整地保存到Query Cache中,以后若有相同的SQL语句执行则直接返回结果。
查询缓存中的好吗?是不是要开启查询缓存呢?其实不建议开启查询缓存,原因是缓存失效非常频繁,只要表更新了,缓存就会失效。所以对于那些更新操作多的表来说简直是灾难,除非是静态表,所以在mysql8中已经将查询缓存取消了。
这是因为sql操作涉及的表不一定只有sql语句中的那些,要在执行器阶段才能确认。
如果表 T 中没有字段 k,而你执行了这个语句 select * from T
where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in
‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?
答 :分析器阶段,在分析器阶段解析器会解析sql语句生成一颗解析树,判断表时候存在,列字段是否存在等。
查询缓存:
只有当查询的语句完全一致(通过哈希查询实现,大小区分)才会命中,命中后直接检查用户权限,之后直接返回数据给客户端
查询优化处理:
语法解析和预处理:根据SQL生成语法解析树,并解析语法错误,预处理器检查解析树是否存在数据上的错误
查询优化器:选择最好的执行计划,包括对语句的优化,对关联顺序的优化,使用索引等
查询执行引擎:
相较查询处理优化阶段,执行引擎阶段仅是将执行计划利用存储引擎提供的接口执行,并不复杂!
1.当我们请求mysql服务器的时候,MySQL前端会有一个监听,请求到了之后,服务器得到相关的SQL语句,执行之前(虚线部分为执行),还会做权限的判断
2.通过权限之后,SQL就到MySQL内部,他会在查询缓存中,看该SQL有没有执行过,如果有查询过,则把缓存结果返回,说明在MySQL内部,也有一个查询缓存.但是这个查询缓存,默认是不开启的,这个查询缓存,和我们的Hibernate,Mybatis的查询缓存是一样的,因为查询缓存要求SQL和参数都要一样,所以这个命中率是非常低的(没什么卵用的意思)。
3.如果我们没有开启查询缓存,或者缓存中没有找到对应的结果,那么就到了解析器,解析器主要对SQL语法进行解析
4.解析结束后就变成一颗解析树,这个解析树其实在Hibernate里面也是有的,大家回忆一下,在以前做过Hibernate项目的时候,是不是有个一个antlr.jar。这个就是专门做语法解析的工具.因为在Hibernate里面有HQL,它就是通过这个工具转换成SQL的,我们编程语言之所以有很多规范、语法,其实就是为了便于这个解析器解析,这个学过编译原理的应该知道.
5.得到解析树之后,不能马上执行,这还需要对这棵树进行预处理,也就是说,这棵树,我没有经过任何优化的树,预处理器会这这棵树进行一些预处理,比如常量放在什么地方,如果有计算的东西,把计算的结果算出来等等...
6.预处理完毕之后,此时得到一棵比较规范的树,这棵树就是要拿去马上做执行的树,比起之前的那棵树,这棵得到了一些优化
7.查询优化器,是MySQL里面最关键的东西,我们写任何一条SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它会怎么去执行?它是先执行username = toby还是password = 1?每一条SQL的执行顺序查询优化器就是根据MySQL对数据统计表的一些信息,比如索引,比如表一共有多少数据,MySQL都是有缓存起来的,在真正执行SQL之前,他会根据自己的这些数据,进行一个综合的判定,判断这一次在多种执行方式里面,到底选哪一种执行方式,可能运行的最快.这一步是MySQL性能中,最关键的核心点,也是我们的优化原则.我们平时所讲的优化SQL,其实说白了,就是想让查询优化器,按照我们的想法,帮我们选择最优的执行方案,因为我们比MySQL更懂我们的数据.MySQL看数据,仅仅只是自己收集到的信息,这些信息可能是不准确的,MySQL根据这些信息选了一个它自认为最优的方案,但是这个方案可能和我们想象的不一样.
8.这里的查询执行计划,也就是MySQL查询中的执行计划,比如要先执行username = toby还是password = 1
9.这个执行计划会传给查询执行引擎,执行引擎选择存储引擎来执行这一份传过来的计划,到磁盘中的文件中去查询,这个时候重点来了,影响这个查询性能最根本的原因是什么?就是硬盘的机械运动,也就是我们平时熟悉的IO,所以一条查询语句是快还是慢,就是根据这个时间的IO来确定的.那怎么执行IO又是什么来确定的?就是传过来的这一份执行计划.(优化就是制定一个我们认为最快的执行方案,最节省IO,和执行最快)
10.如果开了查询缓存,则返回结果给客户端,并且查询缓存也放一份。