ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL8.0中的性能查看及SQL执行顺序

2022-01-26 13:02:34  阅读:210  来源: 互联网

标签:顺序 SQL 生成 虚拟 MySQL8.0 应用 子句 筛选 select


MySQL8.0中性能查看

-- 查询性能工具是否开启(1为开启)
select @@session.profiling ; 
SET profiling = 1;
select * from employees;
-- 查看最近一条sql语句性能开销
show profile;

SQL执行顺序

SQL语法顺序

select[distinct]
from
join
on
where
group by
having
union
order by
limit

执行顺序

from
on
join
where
group by (可以使用select中的别名,后面的语句中都可以使用)
having
select
distinct
union
order by
limit

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。
1、首先对from子句中的前两个表执行一个笛卡尔乘积(交叉联接),此时生成虚拟表 VT1(选择相对小的表做基础表);

2、应用on筛选器,on 中的逻辑表达式将应用到 VT1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 VT2;

3、如果是外连接,就将添加外部行;如果是左连接,就把左表在第二步中过滤的添加进来; 如果是右连接,就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 VT3 ;
如果 from 子句中的表数目多余两个表,那么就将VT3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 VT3;

4、对 VT3 应用 WHERE 筛选器,只有使为 true 的行才插入 VT4。

5、group by 子句将中的唯一的值组合成为一组,得到虚拟表VT5。如果应用了group by,那么后面的所有步骤都只能得到的VT5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行;

6、应用cube或者rollup选项,为VT5生成超组,生成VT6.

7、应用having筛选器,生成VT7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器

8、处理select子句。将VT7中的在select中出现的列筛选出来。生成VT8.

9、应用distinct子句,VT8中移除相同的行,生成VT9。事实上如果应用了group by子句那么distinct是多余的;

10、应用order by子句。按照order_by_condition排序VT9,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用order by 子句查询不能应用于表表达式;

11、应用limit,从游标开始处选择指定数量或比例的行,生成表 TT11,并返回给用户。

标签:顺序,SQL,生成,虚拟,MySQL8.0,应用,子句,筛选,select
来源: https://www.cnblogs.com/aluna/p/15846127.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有