MySQL的邏輯架構
從上圖可以看到,MySQL從邏輯上可以由這些部分組成:
一、連接池組件
管理數據庫連接,包括權限認證、連接限制等功能。
二、管理服務和工具組件
系統管理和控制工具
三、SQL接口組件
接收用戶的SQL命令,返回sql執行結果。
四、解析器組件
對SQL語句進行語法和語義解析,形成語法樹。
五、優化器組件
對SQL語句進行優化,如:選擇合適的索引、多表關聯時決定表關聯順序等,最終決定SQL的執行計劃。
六、緩衝組件
將SQL語句作爲key,sql語句查詢結果作爲value進行緩存。但是它對內存損耗較爲嚴重,且緩存在一些情況下被清空:
1、SQL語句變化
2、被查詢的表數據變化
因此MySQL8.0版本開始不支持緩存。
七、存儲引擎組件
MySQL的存儲引擎是基於表層面的,即可以爲每一張表使用不同的存儲引擎。經常使用的存儲引擎還是InnoDB。
MySQL中的執行流程
而MySQL的一條SQL的執行流程就可以表述如下:
MySQL的物理存儲分析
實際上,MySQL數據庫可以被看作是一個由MySQL軟件管理的文件系統。其從物理層面來說,其內部不同的數據都被存儲爲不同格式的文件,而對於不同的存儲引擎數據存儲方式也是不一樣的。
瞭解MySQL物理文件結構之前先介紹兩個概念:順序IO和隨機IO。
什麼是順序IO呢?我們知道在程序讀取磁盤上的數據時需要經過一個尋址的過程,順序IO就是讀寫數據時都是在連續的存儲區域內進行,這樣就節約了尋址時間,其優點就是讀寫速度快但是消耗更多的存儲空間,因爲磁盤上不一定總是有那麼多連續的存儲空間供程序使用;而隨機IO是在磁盤上尋找合適的位置存放數據,它的優點就是節約存儲空間,但是需要更多的時間進行IO操作。
MySQL重要的文件可以分爲日誌文件和數據索引文件,在linux系統上被保存在/var/lib/mysql
目錄下,在MySQL中,其日誌文件是採用順序IO的方式進行讀寫操作,而數據索引文件是採用隨機IO的方式進行讀寫操作。至於爲什麼採用這種方式其實設計到MySQL實現持久性機制的Write-ahead-log機制,後面寫事務相關知識時候會講到。
MySQL日誌文件分類:
通過show variables like 'log_%'
命令查看MySQL中的日誌使用信息:
錯誤日誌: 錯誤日誌中記錄了MySQL啓動及運行時發生的錯誤的信息。通過上面的log_error 的value可以看到錯誤日誌的位置。在我的雲服務器上它就是/var/log
位置的mysqld.log文件。/etc/my.cnf
中的log-error可以設置錯誤日誌的位置。
二進制日誌(bin log):它記錄了MySQL客戶端所有的DDL和DML操作,所以很明顯其作用就可以用來做主從複製、數據備份、數據恢復等。可以看到它默認沒有開啓,可以通過在/etc/my.cnf
文件中來設置log_bin=mysql-bin來開啓。值得注意的是,每一條DDL語句執行完畢後都會寫到bin_log中,但是DML語句只有在事務提交後才寫入。
慢查詢日誌(slow query log):這個就很重要了,因爲我們可以通過它去定位系統中查詢慢的sql語句,它默認是關閉的,我們去開啓它需要在/etc/my.cnf
文件中添加如下設置:它的含義就是當查詢超過10s時,它就會被記錄在慢查詢日誌log_filename中。
slow_query_log=on
slow_query_time=10
slow_query_log_file=log_filename
事務日誌(redo log / undo log):這兩個日誌的功能有很多,後面需要慢慢講。這裏先理解redo log的作用是保證事務的持久性,即事務提交過程中服務器崩潰,事後仍然可以通過redo log去恢復。而undo log的作用就是事務提交失敗作回滾操作,還有一個作用是實現MySQL的MVVC(多版本併發控制)機制,這些都需要後面詳細說明。
MySQL數據索引文件:
除了上面重要的日誌文件,還有很重要的文件自然是保存在MySQL數據庫中的數據了,在InnoDB存儲引擎中,表結構的定義信息保存在.frm文件中,而數據信息和索引信息都保存在.ibd文件中。
從上圖可以看出,在liuming這個數據庫中,我有三張表:account、table1、table2。
好記性不如爛筆頭,與諸君共勉!