每一個虛線框爲一層,總共三層。mysql
第一層:鏈接層,所包含的服務並非MySQL所獨有的技術。它們都是服務於C/S程序或者是這些程序所須要的 :鏈接處理,身份驗證,安全性等等。算法
第二層值得關注:服務層。這是MySQL的核心部分。一般叫作 SQL Layer。在 MySQL數據庫系統處理底層數據以前的全部工做都是在這一層完成的,包括權限判斷, sql解析,行計劃優化, query cache 的處理以及全部內置的函數(如日期,時間,數學運算,加密)等等。各個存儲引擎提供的功能都集中在這一層,如存儲過程,觸發器,視 圖等。sql
第三層:引擎層。一般叫作StorageEngine Layer ,也就是底層數據存取操做實現部分,由多種存儲引擎共同組成。它們負責存儲和獲取全部存儲在MySQL中的數據。就像Linux衆多的文件系統 同樣。每一個存儲引擎都有本身的優勢和缺陷。服務器是經過存儲引擎API來與它們交互的。這個接口隱藏 了各個存儲引擎不一樣的地方。對於查詢層儘量的透明。這個API包含了不少底層的操做。如開始一個事物,或者取出有特定主鍵的行。存儲引擎不能解析SQL,互相之間也不能通訊。僅僅是簡單的響應服務器 的請求。數據庫
第四層:存儲層。將數據存儲在文件系統上,並完成與存儲引擎的交戶。緩存
相關概念介紹Connectors:指的是不一樣語言中與SQL的交互安全
Management Serveices & Utilities: 系統管理和控制工具服務器
Connection Pool: 鏈接池
管理緩衝用戶鏈接,線程處理等須要緩存的需求。
負責監聽對 MySQL Server 的各類請求,接收鏈接請求,轉發全部鏈接請求到線程管理模塊。每個鏈接上 MySQL Server 的客戶端請求都會被分配(或建立)一個鏈接線程爲其單獨服務。而鏈接線程的主要工做就是負責 MySQL Server 與客戶端的通訊,接受客戶端的命令請求,傳遞 Server 端的結果信息等。線程管理模塊則負責管理維護這些鏈接線程。包括線程的建立,線程的 cache 等。數據結構
SQL Interface: SQL接口。
接受用戶的SQL命令,而且返回用戶須要查詢的結果。好比select from就是調用SQL Interface架構
Parser: 解析器。
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本。在 MySQL中咱們習慣將全部 Client 端發送給 Server 端的命令都稱爲 query ,在 MySQL Server 裏面,鏈接線程接收到客戶端的一個 Query 後,會直接將該 query 傳遞給專門負責將各類 Query 進行分類而後轉發給各個對應的處理模塊。
主要功能:ide
Optimizer: 查詢優化器。
SQL語句在查詢以前會使用查詢優化器對查詢進行優化。就是優化客戶端請求的 query(sql語句),根據客戶端請求的 query 語句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,告訴後面的程序如何取得這個 query 語句的結果。他使用的是選取-投影-聯接策略進行查詢。
用一個例子就能夠理解: select uid,name from user where gender = 1;
這個select 查詢先根據where 語句進行選取,而不是先將表所有查詢出來之後再進行gender過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性所有取出之後再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果
Cache和Buffer: 查詢緩存。
主要功能是將客戶端提交 給MySQL 的 Select 類 query 請求的返回結果集 cache 到內存中,與該 query 的一個 hash 值作一個對應。該 Query 所取數據的基表發生任何數據的變化以後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例很是高的應用系統中, Query Cache 對性能的提升是很是顯著的。固然它對內存的消耗也是很是大的。
若是查詢緩存有命中的查詢結果,查詢語句就能夠直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的。好比表緩存,記錄緩存,key緩存,權限緩存等
可插拔存儲引擎
存儲引擎接口模塊能夠說是 MySQL 數據庫中最有特點的一點了。目前各類數據庫產品中,基本上只有 MySQL 能夠實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是 一個抽象類,但正是由於它成功地將各類數據處理高度抽象化,才成就了今天 MySQL 可插拔存儲引擎的特點。
MySQL區別於其餘數據庫的最重要的特色就是其插件式的表存儲引擎。MySQL插件式的存儲引擎架構提供了一系列標準的管理和服務支持,這些標準與存儲引擎自己無關,多是每一個數據庫系統自己都必需的,如SQL分析器和優化器等,而存儲引擎是底層物理結構的實現,每一個存儲引擎開發者均可以按照本身的意願來進行開發。
注意:存儲引擎是基於表的,而不是數據庫。
查看命令
#查看mysql現已提供什麼存儲引擎 show engines; #查看當前默認的存儲引擎 show variables like ‘%storage_engine%’;MyISAM和InnoDB