經過了解MYSQL架構,對MYSQL有一個總體的認識。mysql
一,Mysql邏輯架構sql
1,邏輯架構圖shell
Mysql也是模塊化設計,整體分爲兩大塊。服務和引擎是分離的(採用插件式的設計)數據庫
1.1,服務器(Server)層:緩存
大部分的服務都在這一層:包括查詢解析,分析,優化,緩存,內置函數,存儲過程,觸發器,視圖等。服務器
1.2,存儲引擎層架構
存儲引擎層負責數據的存儲和提取,支持InnoDB,MyISAM,Memory等存儲引擎。不一樣的存儲引擎公用同一個Service層。服務器經過API和存儲引擎通訊,模塊化
不一樣的存儲引擎之間不會通訊。注意:存儲引擎是不會解析SQL的。函數
二,MYSQL的各個組件優化
1,鏈接器
1.1,要使用數據庫,第一步就是要鏈接到數據庫上,執行: mysql -h $ip -p$port -u $root -p
這時候鏈接器負責處理這個請求,鏈接器負責和客戶端創建鏈接,獲取權限,維持鏈接,管理鏈接。
1.2,若是客戶端太長時間沒動靜,鏈接器會自動斷開這個鏈接。這個時間能夠經過參數 wait_timeout控制,默認8小時。
經過mysql命令查詢當前數據的全部鏈接信息:
其中的Time列,就是顯示了該鏈接保持了多長時間。Command列顯示了每一個鏈接的狀態,Sleep表示這個鏈接處於空閒狀態
1.3,數據庫中的長鏈接,短鏈接
長鏈接:鏈接成功後,若是客戶端持續有請求,就一直使用同一個鏈接
短鏈接:每次執行完不多的幾回查詢就斷開鏈接,下次查詢再從新創建一個。
因爲創建鏈接的過程比較複雜,建議儘可能使用長鏈接。
1.4,生產條件下的問題:在所有使用長鏈接後,Mysql佔用的內存漲的很是快?
緣由分析:Mysql在執行過程當中臨時使用的內存是由鏈接對象管理的,這些資源在鏈接斷開的時候釋放,長鏈接積累下來,可能致使內存佔用過大,
被系統強行殺掉(OOM),就會出現Mysql異常重啓。
解決辦法:
方式一:定時斷開長鏈接,使用一段時間,斷開鏈接,以後查詢再重連
方式二:Mysql5.7以後,每次執行完一個比較大的操做後,執行mysql_reset_connection來從新初始化鏈接。他會把鏈接恢復到剛剛建立的狀態。
這個過程不須要從新鏈接和作權限驗證。
2,查詢緩存
2.1,Mysql拿到一個查詢請求後,會先到查詢緩存查看,以前是否是執行過這條語句。
以前執行過的語句和結果會以 key(查詢語句)-value(查詢結果)對的形式,被直接緩存在內存中。
若是語句不在查詢緩存中,會執行後面的步驟。執行完成後,再把結果存入查詢緩存中。若是命中緩存,就會提升查詢效率
2.2,可是,查詢緩存的弊大於利
由於查詢緩存的失效很是頻繁。只要有對錶的更新,這個表上的全部查詢緩存都會被清空。對於頻繁更新的表,查詢緩存的命中率很是低。
2.3,如何設置是否啓用查詢緩存
query_cache_type = DEMAND ---->這樣sql語句就不適用查詢緩存了
還能夠顯示使用查詢緩存:Select SQL_CACHE * from T where ID = 10;
3,分析器
若是沒有命中查詢緩存,就要開始真正執行語句了
1,分析器首先作 詞法分析。
從你輸入的sql語句中,識別出來 select關鍵字,表示這是一個查詢語句,把字符串 T識別成表名,再把字符串 ID 識別成 列ID。通過分析器,mysql就知道你要幹什麼了。
2,而後作 語法分析。
語法分析器會根據規則,判斷sql語句是否知足sql語法。若是錯誤,會返回:You have an error in your SQL syntax。
4,優化器
當表裏有多個索引的時候,優化器決定使用那個索引。
當一個語句有多個表關聯時,優化器決定各個表的鏈接順序。
優化器階段完成後,這個語句的執行方案就肯定了。
5,執行器
這時候開始執行語句
1,開始執行的時候,先判斷你對這個表T是否有查詢的權限
若是沒有返回權限錯誤,錯誤信息: select command denied to user ‘b’@’localhost’ for table ‘T’。
若是有權限,打開表繼續執行,而後根據表的引擎定義,去使用這個引擎提供的接口。
2,執行流程
2.1,調用InnoDB引擎接口取這個表的第一行,判斷ID值是否是10,若是不是就跳過,若是是就把這行存在結果集中;
2.2,調用引擎接口取 下一行,重複上面的判斷邏輯,直到取到這個表的最後一行。
2.3,執行器把遍歷過程當中知足條件的行,組成結果集,返回給客戶端。
三,Mysql物理存儲架構
1,一個數據庫對應一個文件夾,一張表對應一組文件
2, datadir:存儲數據二進制文件的路徑
3,表結構的組成
frm:表結構定義文件
MYI:索引文件
MYD:數據文件
4,shell>mysqlfrm --diagnostic /data/mysql_data/aaa/.a.frm:能夠把frm文件轉成create table語句。(須要安裝mysqlfrm)
四,查看本身服務器上的數據庫結構:
1,好比我剛安裝好的Mysql5.7數據庫,裏面有一個mysql庫
2,進入data目錄,查看mysql庫中與表相關的文件,好比db表。
3,注意:表的文件和存儲引擎有關係,咱們這裏說的db表的存儲引擎是MyISAM