下面我給出的是 MySQL 的基本架構示意圖,從中你可以清楚地看到 SQL 語句在 MySQL 的各個功能模組中的執行過程。
從圖中可以看出,不同的儲存引擎公用一個server層。
聯結器
-
連線命令
mysql -h$ip -P$port -u$user -p
-
連線保持時間
- 連線完成之後,如果沒有後續的動作,這個連線就會處於空閒狀態,可以在
show processlist
命令中看到。 - 客戶端如果太長時間沒有動靜,聯結器會主動將其斷連。這個引數是wait_timeout控制的,預設時間是8小時。
- 斷開之後再傳送請求的話,就會收到一個錯誤提醒:Lost connection to MySQL server during query。需要客戶端重新連線,然後再傳送請求。
- 連線完成之後,如果沒有後續的動作,這個連線就會處於空閒狀態,可以在
-
長連線佔用記憶體問題
- 在執行過程中,連線中使用的記憶體是管理在連線物件裡面的。這些資源只有在斷連的時候才會釋放。這些長連線累積下來,可能會導致記憶體佔用越來越大,最終被系統OOM掉。
- 解決:
- 定期斷開連線。使用一段時間以後,或者在程式裡面判斷執行過一個比較大的操作之後,重新連線。
- 或者可以在執行過一個較大的操作之後,執行mysql_reset_connection來重新初始化連線資源。
查詢快取
建立連線之後,進行select語句查詢,就會進入查詢快取階段。每次的查詢會把結果放入快取,下次有相同的查詢會直接在快取中獲取即可,無需進入儲存引擎進行查詢。
但是,查詢快取這個事情是弊大於利的,所以不會建議使用。mysql8.0之後直接將該模組刪除了。
為啥有弊呢?因為每次存在update操作的情況下,就會把整個快取都清除掉,導致快取命中率特別低。
在8.0之前的版本,可以直接將query_cache_type設定為DEMAND,這樣的話,查詢語句預設不使用快取。在需要使用查詢快取的地方可以顯示呼叫。mysql> select SQL_CACHE * from T where ID=10;
分析器
分析器先做“詞法分析”,根據語法規則,判斷輸入的sql語句是否滿足mysql語法規則。
優化器
優化器是在表中存在多個索引的情況下,決定用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連線順序。
執行器
MySQL通過分析器知道了你要做什麼,通過優化器知道了該怎麼做,於是就進入了執行器階段,開始執行語句。