MySQL查詢語句的內部執行流程

MySQL 由 Server 層和引擎層兩部分組成。
Server 層包括鏈接器、查詢緩存、分析器、優化器、執行器。
全部的內置函數(如日期、時間、數學和加密函數)、全部跨存儲引擎(存儲過程、觸發器、視圖)的功能都在這層實現。
存儲引擎層負責數據的存儲和提取。
支持 InnoDB、MyIsAM、Menory 等諸多存儲引擎,MySQL 5.5.5 版本開始成爲默認存儲引擎緩存

鏈接器:鏈接器負責跟客戶端創建鏈接、獲取權限、維持和管理鏈接。
1,鏈接創建後即便使用管理員帳號修改了這個用戶的權限,也不會影響已經存在的鏈接權限。只有再新建鏈接纔會使用新的權限設置
2,MySQL 在執行過程當中使用的內存管理在鏈接對象裏,鏈接斷開的時候纔會釋放,長鏈接累積下來,可能會致使內存佔用太大
3,鏈接完成後,若是沒有後續動做,這個鏈接就處於空閒狀態,能夠經過 show processlist 命令查看,command 顯示爲 「Sleep」 是空閒鏈接。
4,若是長時間沒動靜,鏈接器會自動斷開鏈接,斷開鏈接的默認時間爲 8 小時,有參數 wait_timeout 控制。
5,鏈接有長鏈接和短鏈接,短鏈接是每次執行完不多的幾回查詢就斷開鏈接,下次再從新創建一個,創建鏈接的過程比較複雜
,儘量減小創建鏈接的動做,儘可能使用長鏈接。
查詢緩存:鏈接創建完成,執行邏輯就會進入查詢緩存,執行結果以key-value的形式緩存在內存中。
1,查詢緩存失效很是頻繁,只要有對一個表的更新,這個表的全部查詢緩存都會清空。
2,能夠關閉查詢緩存,query_cache_type 成 DEMAND,不使用查詢緩存
3,能夠顯示制定使用查詢緩存,SQL_CACHE
4,MySQL 8.0 版本中刪除了查詢緩存模塊ide

分析器:對 SQL 語句作解析,知道要作什麼
1,分析器執行步驟是先作詞法分析,再作語法分析
2,詞法分析是識別出 SQL 裏面的字符串是什麼
3,語法分析是根據語法規則判斷這個 SQL 是否知足 MySQL 語法,語句不對會作錯誤提醒函數

優化器:在 SQL 開始執行以前要通過優化器的處理,知道怎麼作
1,表裏面有多個索引的時候,決定使用哪一個索引
2,一個語句有多張關聯表的時候,決定各個表的鏈接順序優化

執行器:開始執行語句
1,執行器執行前,先作權限驗證
2,若是命中查詢緩存返回結果的時候,也要作權限驗證
3,查詢也會在優化器以前調用precheck驗證權限
4,執行器會根據表的引擎定義,去使用這個引擎提供的接口加密

執行器執行的流程
1,查詢語句沒有索引、查詢語句有索引是普通索引、查詢語句有索引是惟一索引,三種執行方式有些差異
2,慢日誌中 rows_examined 字段,表示這個語句執行過程當中掃描了多少行,這個值就是執行器每次調用引擎獲取數據行的時候累加的
3,引擎掃描行數跟 rows_examined 並非徹底相同。日誌

相關文章
相關標籤/搜索