mysql解析流程 mysql執行流程解析

2021-10-19 21:29:25 字數 1976 閱讀 5552

mysql 可以分為 server 層和儲存引擎層兩部分

server 層包括聯結器、查詢快取、分析器、優化器、執行器等,涵蓋 mysql 的大多數核 心服務功能,以及所有的內建函式,所有跨儲存引 擎的功能都在這一層實現,比如儲存過程、觸發器、檢視等

而儲存引擎層負責資料的儲存和提取。其架構模式是外掛程式式的,支援 innodb、 myisam、memory 等多個儲存引擎。現在最常用的儲存引擎是 innodb

我們來看一下sql的執行流程

聯結器第一步,你會先連線到這個資料庫上,這時候接待你的就是聯結器。聯結器負責跟客戶端

建立連線、獲取許可權、維持和管理連線

連線完成後,如果你沒有後續的動作,這個連線就處於空閒狀態,你可以在 show processlist 命令中看到它

客戶端如果太長時間沒動靜,聯結器就會自動將它斷開。這個時間是由引數 wait_timeout 控制的,預設值是 8 小時

建立連線的過程通常是比較複雜的,所以在使用中要儘量減少建立連線的動作,也就是盡量使用長連線

但是全部使用長連線後,你可能會發現,有些時候 mysql 占用記憶體漲得特別快,這是因 為 mysql 在執行過程中臨時使用的記憶體是管理在連線物件裡面的。這些資源會在連線斷 開的時候才釋放

怎麼解決這個問題呢?你可以考慮以下兩種方案。

定期斷開長連線。使用一段時間,或者程式裡面判斷執行過乙個占用記憶體的大查詢後, 斷開連線,之後要查詢再重連。

如果你用的是 mysql 5.7 或更新版本,可以在每次執行乙個比較大的操作後,通過執 行 mysql_reset_connection 來重新初始化連線資源。這個過程不需要重連和重新做許可權驗證,但是會將連線恢復到剛剛建立完時的狀態

查詢快取

連線建立完成後,你就可以執行 select 語句了。執行邏輯就會來到第二步:查詢快取。

mysql 拿到乙個查詢請求後,會先到查詢快取看看,之前是不是執行過這條語句。之前 執行過的語句及其結果可能會以 key-value 對的形式,被直接快取在記憶體中。key 是查詢 的語句,value 是查詢的結果。如果你的查詢能夠直接在這個快取中找到 key,那麼這個 value 就會被直接返回給客戶端

如果語句不在查詢快取中,就會繼續後面的執行階段。執行完成後,執行結果會被存入查 詢快取中。你可以看到,如果查詢命中快取,mysql 不需要執行後面的複雜操作,就可 以直接返回結果,這個效率會很高

但是大多數情況下不要使用查詢快取,為什麼呢?因為查詢快取往往弊大於利。

查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清

空。因此很可能你費勁地把結果存起來,還沒使用呢,就被乙個更新全清空了。對於更新

壓力大的資料庫來說,查詢快取的命中率會非常低。除非你的業務就是有一張靜態表,很長時間才會更新一次

你可以將引數 query_cache_type 設定 成 demand,這樣對於預設的 sql 語句都不使用查詢快取

mysql 8.0 版本直接將查詢快取的整塊功能刪掉了,也就是說 8.0 開始徹 底沒有這個功能了

分析器如果沒有命中查詢快取,就要開始真正執行語句了。首先,mysql 需要知道你要做什 麼,因此需要對 sql 語句做解析

分析器先會做「詞法分析」。你輸入的是由多個字串和空格組成的一條 sql 語句, mysql 需要識別出裡面的字串分別是什麼,代表什麼

做完了這些識別以後,就要做「語法分析」。根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這個 sql 語句是否滿足 mysql 語法

優化器經過了分析器,mysql 就知道你要做什麼了。在開始執行之前,還要先經過優化器的處 理。

優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句有多表關聯 (join)的時候,決定各個表的連線順序

優化器階段完成後,這個語句的執行方案就確定下來了,然後進入執行器階段

執行器開始執行的時候,要先判斷一下你對這個表 t 有沒有執行查詢的許可權,如果沒有,就會返 回沒有許可權的錯誤

如果有許可權,就開啟表繼續執行。開啟表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的介面去執行

mysql常用運維 mysql 運維常見操作

mysql密碼的恢復方法之一 1 首先確認伺服器出於安全的狀態,也就是沒有人能夠任意地連線mysql資料庫。因為在重新設定mysql的root密碼的期間,mysql資料庫完全出於沒有密碼保護的 狀態下,其他的使用者也可以任意地登入和修改mysql的資訊。可以採用將mysql對外的埠封閉,並且停止ap...

mysql常用運維 (MYSQL常用運維指令)

1 mysql執行狀態 service mysqld status service mysqld start service mysqld stop 2 檢視sql程序,清理sql程序 show full processlist kill 2920578 3 賬號建立 資料庫授權 4 密碼修改 my...

簡述MySQL安裝流程 MySQL安裝流程

若出現下圖,需要去資源管理器中把mysql程序全結束了,重新啟動即可。1.6.登入mysql 登入mysql 因為之前沒設定密碼,所以密碼為空,不用輸入密碼,直接回車即可 e mysql 5.7.20 winx64 bin mysql u root p enter password 1.7.查詢使用...