MySQL實戰45講學習筆記---基礎架構

    今天開始把《MySQL實戰45講》的知識作一筆記,在加深印象的同時,但願對其它人也有所幫助。mysql

   大致來講,Mysql可分爲Server層和存儲引擎層兩大部分,如圖:sql

 其中,Serve層包括鏈接器、查詢緩存、分析器、優化器、執行器以及全部的內置函數(如:日期時間函數等);存儲引擎層負責數據的存儲和提取,支持InnoDB、MyISAM等多個存儲引擎。如今學用的就是InnoDB,從Mysql 5.5.5版本開始InnoDB成爲了默認的存儲引擎。數據庫

  • 鏈接器

鏈接器負責跟客戶端創建鏈接、獲取權限、維持和管理鏈接。鏈接命令通常這麼寫:緩存

mysql -h$ip -P${port} -u${username} -p

輸入上面命令,再根據提示你輸入密碼後就能夠鏈接上Mysql了。咱們能夠在mysql裏面執行如下命令查看鏈接函數

show processlist

如圖:優化

可看出如今有兩個Mysql鏈接,每個鏈接Command欄顯示爲「Sleep」,Time顯示60,表示這個鏈接處理空閒狀態,已經空閒了60秒,若是客戶端長時間沒有動靜,鏈接器就會自動將它斷開,這個時間默認是8小時,由參數 wait_timeout來控制,如圖:code

   數據庫裏面,長鏈接是指鏈接成功後,若是客戶端持續有請求,則一直使用同一個鏈接,短鏈接是指每次執行完不多的幾回查詢就斷開鏈接,下次查詢再從新建產一個,因爲建產鏈接的過程是比較複雜的,因此建議儘可能使用長鏈接。對象

  但所有使用長鏈接以後,你可能會發現,有些時候Mysql佔用內存漲得特別快,這是由於Mysql在執行過程當中臨時使用的內存是管理在鏈接對象裏面的。這些資源會鏈接斷開時才釋放。因此若是長鏈接累積下來,可能致使內存點用太大,被系統強行殺掉(OOM),從如今看就是Mysql異常重啓了。blog

  解決這個問題有兩種方案:索引

  1. 按期斷開長鏈接。
  2. 若是你用的是Mysql5.7或更新的版本,能夠在每次執行一個比較大的操做後,執行mysql_reset_connection來從新初始化鏈接資源。這個過程不須要重連和從新作權限驗證,可是會將鏈接恢復到剛剛建立時的狀態。

 

  • 查詢緩存

  創建鏈接後,你就能夠執行select語句了,mysql收到查詢請求後,會在查詢緩存中看以前是否是執行過這條語句。以前執行的語句及結果可能會以key-value的形式被直接緩存在內存中,key是查詢的語句,value是查詢的結果。若是查詢語句能在緩存中直接找到key,那麼就把這個value直接返回給客戶端。

  但在大多數狀況下,不建議使用查詢緩存,由於查詢緩存失效很是頻繁,只要有對一個表的更新,這個表上的全部查詢緩存都會被清空。你能夠將參數query_cache_type設置成DEMAND。

  1. query_cache_type=OFF 關閉查詢緩存
  2. query_cache_type=ON,開啓查詢緩存,緩存全部結果,除非select語句使用SQL_NO_CACHE禁用查詢緩存
  3. query_cache_type=DEMAND,只緩存select語句中經過SQL_CACHE指定須要緩存的查詢

這樣對於默認的SQL都不使用查詢緩存,對於你確認要使用查詢緩存的語名,能夠用SQL_CACHE顯示指定如:

select SQL_CACHE * from T where id=1;

注意:Mysql8.0版本直接將查詢緩存的整個功能都刪除了,完全沒有這個功能了。

  • 分析器

分析器會先對SQL語句作詞法分析與語法的分析,若是SQL語句不對,就會收到"You have an error in your SQL syntax"的錯誤提醒。

  • 優化器

優化器是在表裏面有多個索引的時候,決定使用哪一個索引或者是在一個語句有多個關聯(join)的時候,決定各個表的鏈接順序。

  • 執行器
select * from T where id=1;

執行器的流程以下:

調用InnoDB引擎接口取這個表的第一行,判斷ID是否是1,若是不是則跳過,若是是則將這行存在結果集中。重複這樣的操做,直到取到這個表的最後一行。執行器將遍歷過程當中全部知足條件的行組成的記錄集返回給客戶端。

相關文章
相關標籤/搜索