【從零開始的mysql】MySQL系統架構及執行原理

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語句執行則直接返回結果

如果開啓了查詢結果,先將查詢結果緩存
返回結果太多采用增加模式返回

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章