一张图看懂sql运行顺序

坦白讲,SQL的执行顺序和写的顺序完全不一样,这一点一定要理解清楚。
我们先来说说最重要的事情。
Where 和 join 等条件语句最先被实现。
去年我们跑了一个电商报表项目,数据量3 000万。
原因是place state写错了,导致全表扫描,直接烧毁CPU。
另一点是 on 语句在 join 之前运行。
这是我们去年实施这个项目时的一个错误。
结果相关字段不匹配,浪费了我们两天的排查时间。
还有一个关键细节,收集语句是在收集之前执行的。
当我们使用 sum 收集一个项目时,它会在没有先求和的情况下进行求和,并且结果数据完全损坏。
说实话,当时很困惑。
起初我以为这些东西是按顺序排列的,但后来我意识到有些不对劲。
总之,记得先计算条件,然后连接,然后分组,最后对数据进行选择和排序。
等等,还有别的事。
用术语来说,它被称为雪崩效应。
事实上,前部的轻微延迟会降低整个后部的性能。
建议多用少量数据进行测试,不要一旦开始就被大表压垮。

一文搞懂SQL执行顺序

说实话,我在理解SQL执行顺序的时候也是摸着石头过河的。
你给的流程图我看得很清楚,但是如果我讲得更接地气的话,你会更容易理解。

以我之前提出的建议为例。
当时查了销售报表,直接写了SELECT随机拉取数据。
结果跑步的时候就很卡。
后来看实施方案才发现,我写的很奇怪“先保护数据,再聚合成组”。
当时数据库管理员给了我一些建议:WHERE一定要放在BY组之前,否则每次都要重新运行过滤器,就像先洗衣服再消化一样麻烦。

WHERE 和 WHEN 之间的有趣差异特别容易陷入麻烦。
当我第一次学习SQL时,我的朋友总是把条件语句写错位置。
他检查员工工资的例子是错误的 - WHERE 函数无法控制聚合,所以我们必须使用它们。
他当时还跟我争论:“信息过滤到哪里去了?”我给他举了个例子,比如“工资比平均工资高”。
UBI并不关心这个。
EXCEPTION只能用于赛后比较。

说起GROUP BY,真实的案例是相当典型的。
是一家电商公司的报表需求,需要根据用户活动进行分组统计。
这就是为什么有人写了“GROUP BY USER ID”——这是错误的。
如果两个用户 ID 仅具有不同的后缀,则活动组就完全混乱了。
后来改为“GROUP BY CONCAT(user_id, 3 ), SUBSTRING(user_id, -1 ))”,这是正确的。
因此,串联条件取决于数据的特性,不能简单地通过主键来链接。

在JOIN上,当我得到一个错误帐户时,我发现了外部语句中DE子句中编写的代码。
后来我把它简化为写“AB t1 ,t2 UBIC t1 .id = t2 .id”,性能提高了很多。
尽管显式 JOIN 现在很重要,但知道可以使用隐式 JOIN 将使您免于怀疑。

SORT BY,我见过的最愚蠢的编写方法是“SORT COUNT() DESC” - 这将首先查询所有集合,然后查询类,并且内存耗尽。
正确的做法应该是“SORT BY Department_id, COUNT() DESC”,先是类别的类型,然后是类别内的返回顺序。
一家公司需要等待两个小时才能检查 1 00 万枚硬币。

最后,一些琐事:终端位置对性能有很大影响。
我之前尝试过如果END带有WHERE前缀并且在最后,查询时间可以增加一倍。
尽管现代数据库已经高度优化,但不要只是随意地认为“无论如何都会结束”而使用它们。

我没有亲自运行过分布式SQL执行数据库的序列,但我记得有1 0秒的数据延迟。
您需要知道确切的数字。
不管怎样,在做SQL优化的时候,记住“先报表,然后分散,然后分组统计,最后编辑数字和类型”的大方向,一般是不会错的。

一文读懂SQL查询语句执行顺序丨全解析

我记得帮助一位同事调试 SQL。
他编写的这个查询需要很长时间才能运行。
SQL 选择 d.name, COUNT(e.id) 来自员工 JOIN 部门 d ON e.dept_id = d.id 如果电子工资 > 5 000 按 d.Name 分组 计数(e.id)> 1 0 按件订购 (e.id) DESC 限制 1 0
突然卡在进度条上,说WHERE过滤条件好像无效。
我看了一下,发现我居然写了WHERE AVG(e.salary) > 5 000,忘记了WHERE只能使用非聚合条件。
这显然是错误的。

等一下。
我想到了更好的办法。
上次写报告的时候,我在GROUP BY之前加了DISTINCT,系统居然报错了。
我检查了文档,发现 DISTINCT 在 SELECT 之后运行,所以我必须等到分组完成才能删除重复项。

这件事让我想起一件事。
编写 SQL 就像做饭一样。
首先,您需要加热油(FROM/JOIN)。
否则过滤掉(WHERE)。
然后将其分成块(GROUP BY)。
选择好的原料(HAVING)。
最后,季节(选择/不同)。
放在盘子上(按顺序/限制)。

但是具体如何运行数据库呢?例如,我们研究了 Oracle 和 MySQL。
难道顺序还需要微调?您必须真正深入研究源代码才能找到......

当sql语句中where,order by,group by同时使用查询sql语句中三者的顺序

WHERE 过滤行、GROUPBY 组和 ORDERBY 排序。
顺序一定不能混淆。

我上周刚刚修复了一个错误。
ORDERBY 是在 WHERE 之后添加的,数据完全混乱。

说白了:先执行WHERE,选择需要的行。
然后GROUPBY分成批次,并逐批次进行统计。
最后按ORDERBY排序。

如果我正在做的项目中WHERE条件写得好的话,可以省去很多麻烦。
选择正确的分组字段,结果就会正确。

当数据量很大时,先过滤掉不需要计算的数据,效率会高很多。
降序比升序慢。
所以要小心。

我个人的习惯是将一般条件放在 WHERE 中。
分组时,带上适当的列,以便更容易跟踪。

ORDERBY中使用的DESC比ASC快,但可读性较差。
你决定什么更重要。

在数据库优化方面,不同品牌之间存在很大差异。
例如,Oracle和MySQL是不同的。

首先,你的专用卡在哪里?