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

  • 12
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值