Mysql中Sql语句的执行顺序

SQL 语句执行顺序,如下图,共有11个步骤:

具体的每个阶段

  • FORM: 对FROM的 前两个表 计算笛卡尔积。产生虚表VT1

  • ON: 对虚表VT1进行ON筛选,只有那些符合 <join-condition> 的行才会被记录在虚表VT2中

  • JOIN:如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, 如果 from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止(所以,将大数据量的表最后处理性能最好,因为前面处理时虚拟表最小)

  • WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合 <where-condition> 的记录才会被插入到虚拟表VT4中

  • GROUP BY: group by 子句将表中的唯一的值组合成为一组,得到虚拟表VT5。如果应用了group by,那么后面的所有步骤都只能得到的vt5的列或者是聚合函数列,原因在于最终的结果集中只为每个组包含一行

  • CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.

  • HAVING: 对虚拟表VT6应用having过滤,只有符合 <having-condition> 的记录才会被 插入到虚拟表VT7中

  • SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中

  • DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9(如果应用了group by,那么distinct就是多余的)

  • ORDER BY: 将虚拟表VT9中的记录按照 <order_by_list> 进行排序操作,产生虚拟表VT10

  • LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回

最后更新于