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的性能优化方法,一般有建立索引.规避复杂联合查询.设置冗余字段.建立中间表.查询 ...
随机推荐
- 【UVA - 540】Team Queue (map,队列)
Team Queue Descriptions: Queues and Priority Queues are data structures which are known to most comp ...
- hadoop wordcount程序缺陷
在wordcount 程序的main函数中,没有读取运行环境中的各种参数的值,全靠hadoop系统的默认参数跑起来,这样做是有风险的,最突出的就是OOM错误. 自己在刚刚学习hadoop编程时,就是模 ...
- 一起学Android之Activity
概述 本文以一个简单的小例子,简述Android开发中Activity的相关知识,仅供学习分享使用. 什么是Activity? Activity是一个应用程序组件,通常显示为一个页面,用户可以通过Ac ...
- 求导四则运算以及三角函数求导 Derivative formulas
对特定函数的求导. 1:sin(x) 对其进行求斜率.带入公式得:[ sin(x+Δx)- sin(x)]/Δx = [ sinx*cosΔx + cosx*sinΔx -sin x ]/ Δx = ...
- Hexo搭建博客教程(3) - 远程部署到GitHub Pages
本章讲的是如何将本地的个人项目远程部署到 GitHub Pages,涉及到GitHub的项目仓库.Git的使用,以及Hexo的远程部署等. 1. 安装 hexo-deployer-git 插件 想要将 ...
- scikit-learning教程(三)使用文本数据
使用文本数据 本指南的目标是探讨scikit-learn 一个实际任务中的一些主要工具:分析二十个不同主题的文本文档(新闻组帖子)集合. 在本节中,我们将看到如何: 加载文件内容和类别 提取适用于机器 ...
- Chips CodeForces - 333B
Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周 ...
- Hibernate的一级缓存:快照区
参考来源:http://blog.sina.com.cn/s/blog_981ee5d80102w85f.html
- jmeter(二十)JMeter中返回Json数据的处理方法
Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...
- json2.js 源码解读
这一部分是对Date String Number Boolean扩展toString方法,Date的toString是返回UTC格式的字符串,而后面几个是返回原始值. function f(n) {/ ...