您的位置:首页 > 数据库 > MySQL

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

2016-09-07 18:15 656 查看

查询处理:

    · 物理查询处理

    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(TOP) <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,并返回查询结果给用户

   
Where 语句内部的执行顺序也很重要,当做大数据量查询的时候,适当调整过滤条件的顺序会明显增加查询速度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: