Mysql中查询语句的执行顺序

Posted mysnsds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql中查询语句的执行顺序相关的知识,希望对你有一定的参考价值。

一、sql查询语句执行顺序

8Select9distinct 字段名1,字段名2,
(6[fun(字段名)]1from13<join类型>join22on <join条件>4where <where条件>5group by <字段>7having <having条件>10order by <排序字段>11limit <起始偏移量,行数>

二、关键字执行顺序

也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据.

这些步骤执行时, 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。

mysql会先执行from,根据on关键字去筛选表,筛选出的结果再进行join,生成一个临时表。然后去执行where条件去筛选临时表。然后就可以对数据进行group by进行分组,执行having对数据进行进一步筛选,然后select去筛选目标列了,之后需要使用distinct进行去重这样一个表的查询基本就结束了。然后就是对数据进行排序的order by ,排完顺序自然就是取分页了。这样就会将一个完整的sql执行完毕了。

三、on为什么执行在join前面?

对于left jion 和 right join
首先from可以获得主表信息,然后join此时也获得了另一个表信息,执行join时要生成中间表,如果先进行join而不是on,此时则是两个大表之间进行笛卡尔乘积(sql里面表与表之间进行关联时是通过笛卡尔乘积生成中间表),而如果先通过on进行条件筛选,然后再进行join关联,则计算量会大大减少。虽然没有执行join,但是可以通过jion知道是哪些表进行关联,然后通过执行on进行筛选,然后再执行join进行表与表之间的笛卡尔乘积。
对于inner join 和 cross join
对于inner join 和 cross join 在他们后面使用on条件时,mysql都会将on后面的条件优化到where里,on条件相当于是一个where条件

四、关键字对于sql优化的启示

我们知道更多的数据在越早的阶段被过滤掉越好,sql性能也越高。

1.能写在on里的条件,不要写在where里,能写在where里的条件不写在having里
很容易就可以看出来先执行on再执行where最后执行haing,所以条件越靠前月有利于sql的执行。
2.能使用left join 或者right join 的不使用inner join 或者 cross join
其实我们在inner join 或者cross join中使用on其实就是使用where,因为mysql的执行优化器最后都回将on解析成where

MySQL查询语句及子句的执行顺序

MySQL SELECT 查询语句及各子句的执行顺序:

以上是关于Mysql中查询语句的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

python 3 mysql sql逻辑查询语句执行顺序

6_MySQL_子查询和查询语句书写/执行顺序

从建表到关于sql和MySQL的查询语句执行顺序最新详解

mysql如何查询SQL中哪些语句执行最占用CPU?

mysql语句执行顺序

Mysql补充部分:SQL逻辑查询语句执行顺序