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的性能优化方法,一般有建立索引.规避复杂联合查询.设置冗余字段.建立中间表.查询 ...
随机推荐
- 51nod 1095【映射】
思路: 利用一个map记录初始的,利用一个map记录排序后的. #include <bits/stdc++.h> using namespace std; map<string,in ...
- RobotFramework自动化测试框架(1)- RobotFramework简介
对于RobotFramework自动化测试框架,我这里会从三个单元进行阐述,希望能对你有帮助. RobotFramework简介 RobotFramework是什么? Robotframework 是 ...
- 进程与线程(2)- python实现多进程
python 实现多进程 参考链接: https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/ python中实现多进程 ...
- 贪心 HDOJ 5090 Game with Pearls
题目传送门 /* 题意:给n, k,然后允许给某一个数加上k的正整数倍,当然可以不加, 问你是否可以把这n个数变成1,2,3,...,n, 可以就输出Jerry, 否则输出Tom. 贪心:保存可能变成 ...
- 学习JavaScript数据结构与算法 (一)
学习JavaScript数据结构与算法 的笔记, 包含一二三章 01基础 循环 斐波那契数列 var fibonaci = [1,1] for (var i = 2; i< 20;i++) { ...
- win10下JDK安装,配置环境变量后报Error: could not open `C:\Program Files\Java\jre1.8.0_112\lib\amd64\jvm.cfg'
把Path里面的%JAVA_HOME%/bin放在最前面.
- mysql 三大范式【转载】
第一范式(1NF,normal format):字段不能再分. 这是字段的原子性.例如:字段“学期时间”:2014-9-1,2015-1-15. 这个字段“学期时间”可以再分为“学期开始时间”,201 ...
- CSS实现文字旋转/实现角标
主要用到属性transform:rotate(-30deg) example: .divedittable .project-tag div { width: 43px; line-height: 4 ...
- SpringBoot 2.x (7):拦截器
类似以前SpringMVC的拦截器,但也有一些区别 SpringBoot的拦截器有两种方式: 第一种方式:过时的方式,适用于SpringBoot1.x的方式 package org.dreamtech ...
- hihocoder1078 线段树的区间修改
思路: 线段树区间更新.注意这里是把一个区间的所有数全部赋值为一个新的值. 实现: #include <bits/stdc++.h> using namespace std; ; ], l ...