資料庫通常不會被直接使用,而是由其他程式語言通過sql語句呼叫mysql,由mysql處理並返回執行結果。那麼mysql接受到sql語句後,又是如何處理的呢?
首先程式的請求會通過mysql的connectors與其進行互動,請求到處後,會暫時存放在連線池(connection pool)中並由處理器(management serveices & utilities)管理。
當該請求從等待佇列進入到處理佇列,管理器會將該請求丟給sql介面(sql inte***ce)。
sql介面接收到請求後,它會將請求進行hash處理並與快取中的結果進行對比,如果完全匹配則通過快取直接返回處理結果;否則,需要完整的走一趟流程:
由sql介面丟給後面的直譯器(parser),上面已經說到,直譯器會判斷sql語句正確與否,若正確則將其轉化為資料結構。
直譯器處理完,便來到後面的優化器(optimizer),它會產生多種執行計畫,最終資料庫會選擇最優化的方案去執行,盡快返會結果。
確定最優執行計畫後,sql語句此時便可以交由儲存引擎(engine)處理,儲存引擎將會到後端的儲存裝置中取得相應的資料,並原路返回給程式。
注意:(1)如何快取查詢資料?
儲存引擎處理完資料,並將其返回給程式的同時,它還會將乙份資料保留在快取中,以便更快速
的處理下一次相同的請求。具體情況是,mysql會將查詢的語句、執行結果等進行hash,並保
留在cache中,等待下次查詢。
(2)buffer與cache的區別?
從上面的圖可以看到,快取那裡實際上有buffer和cache兩個,那它們之間是否有什麼不同呢?
簡單的說就是,buffer是寫快取,cache是讀快取。
(3)如何判斷快取中是否已快取需要的資料
這裡可能有乙個誤區,覺得處理sql語句的時候,為了判斷是否已快取查詢結果,會將整個流程
走一遍,取得執行結果後再與需要的進行對比,看看是否命中,並以此說,既然不管快取中有沒
有快取到查詢內容,都要整個流程走一遍,那麼快取的優勢又在**??
實際上,並非如此,在第一次查詢後,mysql便將查詢語句以及查詢結果進行hash處理並保留
在快取中,sql查詢到達之後,對其進行同樣的hash處理後,將兩個hash值進行對照,如果一
樣,則命中,從快取中返回查詢結果;否則,需要整個流程走一遍。
MySQL執行機制
建立連線 connectors connection pool 通過客戶端 伺服器通訊協議與mysql建立連線。mysql 客戶端與服務端的通訊方式是 半雙工 對於每乙個 mysql 的連線,時刻都有乙個執行緒狀態來標識這個連線正在做什麼。id 執行緒id,可以使用kill xx user 啟動這個...
託管模組結構及執行機制
託管檔案模組組成 pe表頭 檔案型別 gui,cui,dll 時間標記 檔案建立時間 text部分 包含jmp corexemain指令 idata部分,保護mscoree.dll引用 clr表頭 包含託管模組資訊 clr版本號,main方法的methoddef元資料標記,託管模組的元資料,資源,強...
PHP CI框架目錄結構及執行機制
ci目錄結構 應用資料夾中主要是存放控制器 模型和檢視等,系統資料夾中主要是存放組成ci的核心檔案的,index.php入口檔案是乙個單一入口檔案,所謂單一檔案是指在乙個 應用程式 中,所有的請求都是指向的這麼乙個檔案,由它負責接收並處理url中的控制器和方法。換句話說,它呼叫乙個 控制器 然後返回...