JAVA执行过程sql,SQL 执行过程
一、MySQL架構總覽:
二、查詢執行流程
一條select的生存周期:
流程:
1.連接
1.1客戶端發起一條Query請求,監聽客戶端的‘連接管理模塊’接收請求;
1.2將請求轉發到‘連接進/線程模塊’;
1.3調用‘用戶模塊’來進行授權檢查;
1.4通過檢查后,‘連接進/線程模塊’從‘線程連接池’中取出空閑的被緩存的連接線程和客戶端請求對接,如果失敗則創建一個新的連接請求;
2.處理
2.1先查詢緩存,檢查Query語句是否完全匹配,接著再檢查是否具有權限,都成功則直接取數據返回;
2.2上一步有失敗則轉交給‘命令解析器’,經過詞法分析,語法分析后生成解析樹;
2.3接下來是預處理階段,處理解析器無法解決的語義,檢查權限等,生成新的解析樹;
2.4再轉交給對應的模塊處理;
2.5如果是SELECT查詢還會經由‘查詢優化器’做大量的優化,生成執行計劃;
2.6模塊收到請求后,通過‘訪問控制模塊’檢查所連接的用戶是否有訪問目標表和目標字段的權限;
2.7有則調用‘表管理模塊’,先是查看table cache中是否存在,有則直接對應的表和獲取鎖,否則重新打開表文件;
2.8根據表的meta數據,獲取表的存儲引擎類型等信息,通過接口調用對應的存儲引擎處理;
2.9上述過程中產生數據變化的時候,若打開日志功能,則會記錄到相應二進制日志文件中;
3.結果
3.1Query請求完成后,將結果集返回給‘連接進/線程模塊’;
3.2返回的也可以是相應的狀態標識,如成功或失敗等;
3.3‘連接進/線程模塊’進行后續的清理工作,并繼續等待請求或斷開與客戶端的連接;
查詢緩存(query cache)
在解析一個查詢語句之前,如果查詢緩存是打開的,那么MySQL會優先檢查這個查詢是否命中查詢緩存中的數據。這個檢查是通過一個對大小寫敏感的哈希查找實現的。查詢和緩存中的查詢即使只有一個字節不同,那也不會匹配緩存結果,這種情況查詢會進入下一個階段的處理。
如果當前的查詢恰好命中了查詢緩存,那么在返回查詢結果之前MySQL會檢查一次用戶權限。這仍然是無須解析查詢SQL語句的,因為在查詢緩存中已經存放了當前查詢需要訪問的表信息。如果權限沒有問題,MySQL會跳過所有其他階段,直接從緩存中拿到結果并返回給客戶端。這種情況下,查詢不會被解析,不用生成執行計劃,不會被執行。
語法解析器和預處理器
首先,MySQL通過關鍵字將SQL語句進行解析,并生成一棵對應的“解析樹”。MySQL解析器將使用MySQL語法規則驗證和解析查詢。例如,它將驗證是否使用錯誤的關鍵字,或者使用關鍵字的順序是否正確等,再或者它還會驗證引號是否能前后正確的匹配。
預處理器則根據一些MySQL規則進一步檢查解析樹是否合法,例如,這里講檢查數據表和數據列是否存在,還會解析名字和別名,看看它們是否有歧義。
下一步預處理器會驗證權限,這通常很快,除非服務器上有非常多的權限設置。
三、SQL解析順序
SQL語句:
SELECT DISTINCT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT
然而它的執行順序是這樣的:
FROM ON JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY LIMIT
這里配上sql 解析圖,很清晰:
總結
以上是生活随笔為你收集整理的JAVA执行过程sql,SQL 执行过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU2138 随机素数测试 Mille
- 下一篇: discuz x2.5 mysql_Di