MySQL系統架構及執行原理
mysql體系架構
網絡連接層
提供與mysql服務器建立連接的支持,目前幾乎支持所有主流的服務編程技術,通過各自api與mysql建立連接
服務層
服務層主要包括:
- 連接池: 負責存儲和管理客戶端的數據庫連接,一個線程負責管理一個連接
- 系統管理和控制工具: 備份恢復,安全管理,集羣管理等
- sql接口: 用於接收客戶端發送來的sql命令,並返回結果
- 解析器: 負責將sql解析成解析樹,然後根據mysql規則進行進一步檢查解析樹是否合法
- 查詢優化器: 當解析樹通過解析器語法檢查後,交給優化器將其轉化成執行計劃,然後與存儲引擎交互
例如:select id,name from user where age= 12;
1.優化器會先進行where條件過濾,
2.然後再根據查詢的屬性(就是這裏的sql查詢字段id,name)進行屬性投影,
3.將之前的過濾後的結果和投影的結果聯接生成結果
- 緩存: 由一系列小緩存註冊,如表緩存,記錄緩存,權限緩存,引擎緩存等,如果在緩存中能夠命中查詢結果,就可以直接從緩存中獲取數據
存儲引擎層
負責mysql中數據存儲和提取,與系統文件層進行交互,服務器的執行引擎通過接口與存儲引擎進行通信。
系統文件層
主要負責將數據文件和日誌文件存儲在文件系統上,並完成與存儲引擎的交互,是文件的物理存儲層。主要包含日誌文件,數據文件,配置文件,pid,socket文件等
- 日誌文件:
- 錯誤日誌:默認開啓
show variables like '%log_error%'
- 通用查詢日誌:記錄查詢語句
show variables like '%general%'
- 二進制日誌:記錄對數據庫的修改操作,語句發生時間,執行時長,但是不記錄select、show等不修改數據庫的sql,主要用於數據庫恢復和主從複製
show variables like '%log_bin%' //是否開啓
show variables like '%binlog%' //參數查看
show binary logs //查看日誌文件
- 慢查詢日誌 :記錄執行時間超時的查詢sql,默認10s
show variables like '%slow_query%' //是否開啓
show variables like '%long_query_time%' //時長
- 錯誤日誌:默認開啓
- 配置文件: 用於存放配置信息(即my.cnf、my.ini文件)
- 數據文件: 存儲在磁盤上數據庫文件
- db.opt文件: 記錄數據庫的默認使用的字符集和校驗規則
- frm文件: 存儲與表相關的元數據信息,表結構定義信息,每張表都會有一個frm文件
- MYD文件:myisam存儲引擎的表數據信息,每張表對應一個.MYD文件
- MYI文件:myisam存儲引擎的索引信息,每張表對應一個.MYI文件
- ibd和IBDATA文件:存放InnoDB的數據文件(包括索引),InnoDB存儲引擎有兩種表空間方式:獨享表空間和共享表空間,獨享表空間使用.ibd文件存放數據,每張InnoDB表對應一個.ibd文件。共享表空間使用.ibdata文件,所有表共同使用一個(或多個,自行配置).ibdata文件
- ibdata1文件:系統表空間數據文件,存儲表元數據,Undo日誌等
- ib_logfile0、ib_logfile1文件:Redo log日誌文件
- pid文件: mysql在linux環境下的進程文件,存放自己進程id
- socket文件: linux纔有的,linux環境下客戶端連接可以不通過TCP/IP網絡而直接使用Unix Socket來連接mysql
mysql運行機制
建立連接
通過客戶端/服務器通信協議與mysql建立連接,mysql客戶端與服務端通信方式是“半雙工”。
通訊機制:
- 全雙工:能同時發送和接收數據
- 半雙工:指某一刻要麼發數據,要麼接收數據,不能同時
- 單工:只能發數據或者只能接數據
對於每一個mysql的連接,時刻都有一個線程狀態來表示這個連接正在做什麼。
查詢線程信息show processlist;
查詢緩存
如果開啓了查詢緩存,在查詢過程中查詢到完全相同的sql時,回將查詢結果從緩存中直接返回個客戶端(mysql 8已經廢棄了這個功能)
解析器
將客戶端發送的sql進行語法解析,生成解析樹。預處理器根據mysql規則進一步檢查解析樹是否合法,例如檢查數據表和數據列是否存在,還會解析名字和別名是否有歧義等,最後生成新的解析樹
查詢優化器
根據解析樹生成最優的執行計劃,mysql使用很多優化策略生成最優的執行計劃,可以分爲兩類:靜態優化(編譯時優化),動態優化(運行時優化)
等價變換策略
1.5=5 and a>5會優化成 a>5
2.a<b and a= 5 會變成b>5 and a=5
3.基於聯合索引,調整條件位置等
函數優化
InnoDB引擎的min函數只需要找索引最左邊
InnoDB引擎的max函數只需要找索引最右邊
MyISAM引擎count(*),不需要計算可以直接返回
in優化
對in查詢會先排序,再採用二分查找,例如where id in(2,1,3),變成in(1,2,3)
提前終止查詢
使用了limit時,獲取到limit所需數據後就不再遍歷了
查詢執行引擎執行sql
查詢執行引擎會根據sql語句中表的存儲引擎類型,以及對應的api接口與底層存儲引擎或物理文件交互,得到結果返回客戶端,如果開啓了查詢緩存,會將sql語句和結果保存到查詢緩存中,一會再有相同的sql語句執行則直接返回結果
如果開啓了查詢結果,先將查詢結果緩存
返回結果太多采用增加模式返回