個人DBA之路:MYSQL架構

經過了解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

相關文章
相關標籤/搜索