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