ITPub博客

首页 > 数据库 > MySQL > MySQL 查询处理 SQL查询执行顺序

MySQL 查询处理 SQL查询执行顺序

翻译 MySQL 作者:神谕丶 时间:2015-10-08 15:29:42 0 删除 编辑
转载自姜总的书

◇ 
查询处理:

    · 物理查询处理
    MySQL的DB层有Parser与Optimizer两个组件:
    Parser用于分析SQL语句。
    Optimizer用于对SQL语句优化,选取最优路径来选取数据,若表上有索引,那么优化器会判断SQL语句是否可以利用该索引来进行优化。
    通过Parser和Optimizer的解析和优化,这就是物理查询的处理过程。

    ·逻辑查询处理    
     (8)SELECT (9)DISTINCT <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>
     (11)LIMIT <limit_number>

    分析:
    (1)FROM:对FROM子句中的左右表执行笛卡尔积,产生虚拟表VT1
    (2)ON:对虚拟表VT1应用ON筛选,符合<join_condition>的行被插入虚拟表VT2中
    (3)JOIN:若指定了左外连接或右外连接,那么保留表中未匹配的行作为外部行添加到虚拟表VT2中,产生虚拟表VT3,若from包含两个以上的表,则对VT3和下一个表重复执行(1)(2)(3)
    (4)WHERE:对虚拟表VT3应用WHERE过滤条件,符合<where_condition>的记录插入到虚拟表VT4中
    (5)GROUP BY:据GROUP BY字句中的列,对VT4进行分组,产生虚拟表VT5
    (6)WITH:对表VT5进行CUBE或ROLLUP,产生虚拟表VT6
    (7)HAVING:对VT6应用HAVING过滤器,符合<having_condition>的记录才被插入虚拟表VT7
    (8)SELECT:选择指定的列,插入虚拟表VT8中
    (9)DISTINCT:对VT8去重复数据,产生虚拟表VT9
    (10)ORDER BY:对VT9中的行根据<order_by_list>进行排序,产生虚拟表VT10
    (11)LIMIT:从VT10中取出指定行,产生虚拟表VT11,并返回查询结果给用户



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773961/viewspace-1813489/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: MySQL SQL_MODE详解
请登录后发表评论 登录
全部评论
微信公众号:神谕的暗影长廊

注册时间:2014-07-28

  • 博文量
    161
  • 访问量
    1195299