sql语句执行顺序与性能优化(1)
一、首先我们看一下mysql的sql语句的书写顺序 。
select--distinct--from--on--where--group by--having--聚合函数cube、rollup--order by--limit--集合运算UNION,EXCEPT和INTERSECT
二、MySQL的语句执行顺序,这个可以从官方文档查看 ,也可以自己测试。
from -> on -> join -> where -> group by -> 聚集函数 cube|rollup -> having -> select -> 去重Distinct ->集合操作-> 排序order by -> 抽取分页limit
MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是 FROM操作,最后执行的是LIMIT(条数)操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明 的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。
方法/步骤
下面我们来具体分析一下查询处理的每一个阶段
1. FROM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
2. ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
3. JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3,
run from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为 止。
4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
6. CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
7. HAVING: 对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。
8. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
9. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
10. ORDER BY: 将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10.
11. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。
END
三、简要分析子句作用和执行方式,特意对应sql执行顺序
可以充分考虑执行顺序和执行方式和执行开销,灵活调整sql,加快执行速度。布尔表达式的位置可以直接用true和false加入测试验证一下
from--where--group by--聚合函数--having--select--distinct--union all--order by--limit
from:数据来源,需要从哪个数据表检索数据 从右向左,从下向上(←↑)
on:连接表进行过滤,布尔表达式 。用逗号分隔的多个条件是 从右向左,从下向上(←↑),而单个布尔表达式内部是从左向右,会触发短路效果(比如先执行and和or的左侧)。
join:数据来源,高开销,按on条件保留驱动表未连接数据
where:过滤表中数据的条件,布尔表达式,可以使用等号起到连接的作用 。 用逗号分隔的多个条件是 从右向左,从下向上(←↑),而单个布尔表达式内部是从左向右,会触发短路效果(比如先执行and和or的左侧)。
group by:如何将上面过滤出的数据分组 ,通常将group by 的字段放到select子句里,从上到下,左到右(→↓)
cube,rollup:聚集函数,高开销,聚合函数(统计用 sum,avg,max,min等)
having:对上面已经分组的数据进行过滤的条件 ,布尔表达式,高开销
select:获取结果集,或列的计算结果 ,筛选结果列
distinct:针对字段去除结果集重复行
union all,union,except,intersect :对结果集进行集合操作,差集,并集等,多个分句从左向右,从上到下,左到右(→↓),最左分句先开始。
order by:按字段排序结果集。高开销,多字段从左向右从上向下执行 (→↓)
limit :和oracle的伪列 rownum对应执行位置,sqlserver的 top对应执行位置。都是最后执行的。在一个where子句里rownum和top的位置不影响执行结果。截掉多余的数据,保留剩余结果集。
针对表和多个条件从右向左执行,针对结果集、字段、布尔表达式是从左向右执行。
四、sql子句的默认行为总结
1.group by语句有默认的排序行为
2.union 子句默认会去重排序
五、因为sql优化和很多因素相关 ,例如下面这些,我会在本系列逐项解析。
1.sql语句内的执行顺序 和执行开销
2.sql从执行到输出的全生命周期
3.sql执行计划
4.缓存的存在和调用
5.表结构(schama),索引和视图
6.数据量 和 数据存储结构
7.所用数据库(schama)
8.数据库执行引擎
9.cpu性能和内存占用
10.磁盘IO和网络
2018-10-14
sql语句执行顺序与性能优化(1)的更多相关文章
- MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图
http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...
- MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)
在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:
- Oracle sql语句执行顺序
sql语法的分析是从右到左 一.sql语句的执行步骤: 1)词法分析,词法分析阶段是编译过程的第一个阶段.这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构 ...
- 说说我对SQL语句执行顺序的理解,以SQL Server为例
有人说SQL语句难学,其实并不难!只要掌握了基本的语句执行顺序,用程序化的思维分析结构,再难的问题也会迎刃而解! 假设有如下表emp 现在要求 列出员工姓名(ename)中不含A的所有人按照部门编号( ...
- hive sql 语句执行顺序及执行计划
hive 语句执行顺序 from... where.... select...group by... having ... order by... 执行计划 Map Operator Tree: Ta ...
- sql 语句执行顺序
一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图 ...
- Oracle sql语句执行顺序(转)
from: http://blog.csdn.net/lailai186/article/details/12612263 sql语法的分析是从右到左 一.sql语句的执行步骤:1)语法分析,分析语句 ...
- SQL语句最基本的性能优化方法
有些人还不知道sql语句的基本性能优化方法,在此我简单提醒一下,最基本的优化方法: 1.检查是否缺少索引.调试的时候开启“包括实际的执行计划” 执行后会显示缺少的索引, 然后让dba帮助添 ...
- MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介
网站或服务的性能关键点很大程度在于数据库的设计(假设你选择了合适的语言开发框架)以及如何查询数据上. 我们知道MySQL的性能优化方法,一般有建立索引.规避复杂联合查询.设置冗余字段.建立中间表.查询 ...
随机推荐
- poj3069【贪心,水】
妈蛋,题意看错-看了挑战时被标记的点还是给出的点,瞎搞了半个多小时... = =都想气的扔进水题系列了 #include <iostream> #include <cstdio> ...
- 洛谷 P3711 仓鼠的数学题【伯努利数+多项式科技】
有个东西叫伯努利数--一开始直接·用第一类斯特林推到自闭 式子来源:https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p3711 https ...
- IDEA设置取消自动显示参数提示
IDEA设置取消自动显示参数提示 最近在使用IDEA的过程中,发现方法中一直显示形参名的提示,无法选中,也无法删除,基于不同人的使用习惯不同,有的人不喜欢这种提示,我也在网上寻找各种解决方案,由于搜索 ...
- deque双向队列
对于双向队列,与队列queue以及vector容器的区别就在于,名字不同,也就是它是双向的,可以从头开始操作,也可以从末尾开始操作. 双向队列的常用方法跟队列queue差不多: 头文件: #inclu ...
- 洛谷 P2398 GCD SUM || uva11417,uva11426,uva11424,洛谷P1390,洛谷P2257,洛谷P2568
https://www.luogu.org/problemnew/show/P2398 $原式=\sum_{k=1}^n(k\sum_{i=1}^n\sum_{j=1}^n[(i,j)=k])$ 方法 ...
- Oracle JDK各版本下载地址记录
Oracle JDK各版本下载地址: https://www.oracle.com/technetwork/java/javase/archive-139210.html
- MySQL优化步骤和my.cnf优化配置
1.查看机器配置,指三大件:cpu.内存.硬盘 2.查看mysql配置参数 3.查看mysql运行状态,可以用mysqlreport工具来查看 4.查看mysql的慢查询 依次解决了以上问题之后,再来 ...
- AJPFX谈Java 性能优化之基本类型 vs 引用类型
★名词定义 先明确一下什么是“基本类型”,什么是“引用类型”. 简单地说,所谓基本类型就是 Java 语言中如下的8种内置类型: booleancharbyteshortintlongfloatdou ...
- Java GUI简介
Java有2个GUI库:AWT.Swing. AWT是SUN最早提供的GUI库,依赖本地平台,界面不好看,功能有限.之后推出了Swing,Swing并没有完全替代AWT,而是建立在AWT基础上的.Sw ...
- 各个浏览器CSS中的Bugs及解决方案
Bugs及解决方案列表(以下实例默认运行环境都为Standard mode): 如何在IE6及更早浏览器中定义小高度的容器? 方法: #test{overflow:hidden;height:1px; ...