MySQL邏輯查詢處理

奮鬥的小青年_發表於2017-01-01

我們經常寫sql語句,但是sql語句的執行順序是怎樣的,這點是我們需要知道的。下面就分享一下sql語句的執行順序。

1、  from :對from子句中的左表和右表執行笛卡爾積,產生虛擬表VT1。

2、  ON:對虛擬表VT1應用ON篩選,只有那些符合join_condition的行才被插入虛擬表VT2中。

3、  JOIN:如果指定了outer join那麼保留表中未匹配的行作為外部行新增到虛擬表VT2中,產生虛擬表VT3。如果from子句包含兩個以上的表,則對上一個連線生成的結果表VT3和下一個表重複執行步驟1,知道處理完所有的表為止。

4、  Where:對虛擬表VT3應用where過濾條件,只有符合where_condition的記錄才被插入虛擬表VT4中。

5、  Group by:根據group by子句中的列,對VT4中的記錄進行分組操作,產生VT5.

6、  CUBE|ROLLUP:對錶VT5進行CUBE或ROLLUP操作,產生表VT6。

7、  Having:對虛擬表VT6應用HAVING過濾器,只有符合having_condition的記錄才被插入虛擬表VT7中。

8、  Select:第二次執行select操作,選擇指定的列,插入到虛擬表VT8中。

9、  Distinct:去除重複資料,產生虛擬表VT9。

10、 Order by:將虛擬表VT9中的記錄按照order_by_list進行排序操作,產生虛擬表VT10.

11、 Limit:取指定行的記錄,產生虛擬包VT11,並返回給查詢使用者。

注:上述的執行順序只是sql語句的邏輯執行順序,因為表中存在索引和分割槽等優化資料庫的物理操作,具體執行sql語句的時候可能會根據優化的不同而採取不同的執行方式。所以sql語句具體是怎麼執行的,還需要看sql語句的執行計劃。

相關文章