MySQL 查詢處理 SQL查詢執行順序

神諭丶發表於2015-10-08
轉載自姜總的書

◇ 
查詢處理:

    · 物理查詢處理
    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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章