sql执行顺序

最近在处理一个问题时,发现以下问题,先是看的sql的执行效率,后来经explain后发现,越精简的sql,越快,也就是查的越少越好,还有就是最好不要distinct,会减少效率。

执行顺序如下:每一步的前面是执行的顺序

 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。下面是对应用于SQL server 2000SQL Server 2005的各个逻辑步骤的简单描述。

(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

逻辑查询处理阶段简介

  1. FROMFROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
  2. ONVT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2
  3. OUTER(JOIN) 果指定了OUTER JOIN(相对于CROSS JOIN (INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
  4. WHEREVT3应用WHERE筛选器。只有使<where_condition>true的行才被插入VT4.
  5. GROUP BYGROUP BY子句中的列列表对VT4中的行分组,生成VT5.
  6. CUBE|ROLLUP把超组(Suppergroups)插入VT5,生成VT6.
  7. HAVINGVT6应用HAVING筛选器。只有使<having_condition>true的组才会被插入VT7.
  8. SELECT处理SELECT列表,产生VT8.
  9. DISTINCT将重复的行从VT8中移除,产生VT9.
  10. ORDER BYVT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
  11. TOPVC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

还有处理另一个问题是,我们平常作的插入工作,很是频繁,但是都是不会做兼容的,当并发高的时候,也就是前段同时发送两个一样的请求时,当主键相同,而数据库主键又唯一的时候,就会报错,主键唯一,但是如果我们在插入的语句中加入  ON DUPLICATE KEY UPDATE  userId = #{输入主键} 这回更新主键插入的时间,但是,这个误差可以接受。。前段则需要在这里也做兼容,这样就可以完全避免个别bug的存在

如有错误,请邮件zs253499660@sina.com,如有更好的方法,可以推荐
原文地址:https://www.cnblogs.com/senjiang/p/10126902.html