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

转载自姜总的书

◇ 
查询处理:

    · 物理查询处理
    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博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-1813489/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29773961/viewspace-1813489/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值