Mysql 语法执行顺序
生活随笔
收集整理的這篇文章主要介紹了
Mysql 语法执行顺序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
熟悉Mysql 語法的小伙伴們都知道sql的語法順序,如下:
select[distinct] from join(如left join) on where group by having union order by limit如果有去查閱一些文檔或書籍,應該就知道sql在執行的過程過其實并沒有按照上訴的語法順序執行的,它內部機制中會對語法進行解析,處理,優化 后生成查詢計劃,然后交給查詢執行引擎 調用相應的存儲引擎處理,如下:
這里主要是對最終的語法執行順序進行一個分析,其他部分以后進行分析或者感興趣的可以查找一些相關資料
🤔思考:那么語法的最終執行順序應該是如何?什么關鍵字先被處理呢?為什么要知道執行順序?知道了執行順序對我們寫sql有什么幫助呢?
不多說,先直接看下順序,以下是語法的執行順序:?
from on join where group by having select distinct union order by下面我們來具體分析一下查詢處理的每一個階段:
- FROM: 首先會執行from語句,把數據庫的表文件加載到內存中。若有多張表,則多表計算笛卡爾積。產生虛表VT1(virtual table)
- ON: 對虛表VT1進行ON篩選,篩選出那些符合的行并且在內存中生成一張臨時虛表VT2中。
- JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會作為外部行添加到虛擬表VT2中,產生虛擬表VT3, rug from子句中包含兩個以上的表的話,那么就會對上一個join連接產生的結果VT3和下一個表重復執行步驟1~3這三個步驟,一直到處理完所有的表為止。
- WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合的記錄才會被插入到虛擬表VT4中。
- GROUP BY: 根據group by子句中的列,對VT4中的記錄進行分組操作,產生VT5.
- CUBE | ROLLUP: 對表VT5進行cube或者rollup操作,產生表VT6. (注CUBE|ROLLUP 是對數據的聚合操作)
- HAVING: 對虛擬表 VT6 應用having過濾,只有符合的記錄才會被 插入到虛擬表 VT7 中。
- SELECT: 執行select操作,選擇指定的列,插入到虛擬表VT8中。
- DISTINCT: 對VT8中的記錄進行去重。產生虛擬表VT9.
- ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進行排序操作,產生虛擬表VT10.
- LIMIT:取出指定行的記錄,產生虛擬表VT11, 并將結果返回。
看完之后,相信都對sql語句有了新的認識,我們在編寫sql的時候能更少的出錯,并能編寫更加優雅的代碼。除此之外我們還可以知道哪些信息呢?對索引的使用相信大家也應該有更多的想法了,剩下的就是在實踐中一步步摸索。
?
?
總結
以上是生活随笔為你收集整理的Mysql 语法执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 高效遍历map_精髓!Java
- 下一篇: 推荐一个值得加入C++开发者俱乐部