Mysql总体架构
一、Mysql 的用戶與權限管理
- mysql的用戶管理:創建用戶、查看用戶、設置密碼、修改用戶、刪除用戶
- mysql權限管理:授予權限、收回權限、查看權限
授權命令:
grant 權限1,權限2,…權限n on 數據庫名稱.表名稱 to 用戶名@用戶地址 identified by ‘連接口令’; 該權限如果發現沒有該用戶,則會直接新建一個用戶。 grant select,insert,delete,drop on atguigudb.* to li4@localhost;#給li4用戶用本地命令行方式下,授予atguigudb這個庫下的所有表的插刪改查的權限。 grant all privileges on *.* to joe@'%' identified by '123'; #授予通過網絡方式登錄的的joe用戶 ,對所有庫所有表的全部權限,密碼設為123. 查看當前用戶權限 show grants; 收回權限命令: revoke 權限1,權限2,…權限n on 數據庫名稱.表名稱 from 用戶名@用戶地址 ; 收回全庫全表的所有權限 REVOKE ALL PRIVILEGES ON mysql.* FROM joe@localhost; #收回mysql庫下的所有表的插刪改查權限 REVOKE select,insert,update,delete ON mysql.* FROM joe@localhost;注意:必須用戶重新登錄后才能生效
二、Mysql邏輯架構介紹(連接層,服務層,核心層和存儲引擎層)
-
1.連接層
最上層是一些客戶端和連接服務,包含本地sock通信和大多數基于客戶端/服務端工具實現的類似于tcp/ip的通信。主要完成一些類似于連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,為通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基于SSL的安全鏈接。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。 -
2.服務層
Management Serveices & Utilities:
系統管理和控制工具
SQL Interface: SQL接口
接受用戶的SQL命令,并且返回用戶需要查詢的結果。比如select from就是調用SQL Interface
Parser: 解析器
SQL命令傳遞到解析器的時候會被解析器驗證和解析
Optimizer: 查詢優化器。
SQL語句在查詢之前會使用查詢優化器對查詢進行優化。
用一個例子就可以理解: select uid,name from user where gender= 1;
優化器來決定先投影還是先過濾。
Cache和Buffer: 查詢緩存。
如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等
- 3.引擎層
存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。后面介紹MyISAM和InnoDB - 4.存儲層
數據存儲層,主要是將數據存儲在運行于裸設備的文件系統之上,并完成與存儲引擎的交互。 - 5.總體架構流程圖:
- 6.查詢流程大致:
mysql客戶端通過協議與mysql服務器建連接,發送查詢語句,先檢查查詢緩存,如果命中,直接返回結果,否則進行語句解析,也就是說,在解析查詢之前,服務器會先訪問查詢緩存(query cache)——它存儲SELECT語句以及相應的查詢結果集。如果某個查詢結果已經位于緩存中,服務器就不會再對查詢進行解析、優化、以及執行。它僅僅將緩存中的結果返回給用戶即可,這將大大提高系統的性能。
語法解析器和預處理:首先mysql通過關鍵字將SQL語句進行解析,并生成一顆對應的“解析樹”。mysql解析器將使用mysql語法規則驗證和解析查詢;預處理器則根據一些mysql規則進一步檢查解析數是否合法。
查詢優化器當解析樹被認為是合法的了,并且由優化器將其轉化成執行計劃。一條查詢可以有很多種執行方式,最后都返回相同的結果。優化器的作用就是找到這其中最好的執行計劃。。
然后,mysql默認使用的BTREE索引,并且一個大致方向是:無論怎么折騰sql,至少在目前來說,mysql最多只用到表中的一個索引。
- 7.sql執行順序
手寫:
機讀:
注意:隨著Mysql版本的更新換代,其優化器也在不斷的升級,優化器會分析不同執行順序產生的性能消耗不同而動態調整執行順序。
三、Mysql存儲引擎
- 查看命令:
- 各引擎介紹:
1、InnoDB存儲引擎
InnoDB是MySQL的默認事務型引擎,它被設計用來處理大量的短期(short-lived)事務。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。
2、MyISAM存儲引擎
MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM不支持事務和行級鎖,有一個毫無疑問的缺陷就是崩潰后無法安全恢復。
3、Archive引擎
Archive檔案存儲引擎只支持INSERT和SELECT操作,在MySQL5.1之前不支持索引。
Archive表適合日志和數據采集類應用。
根據英文的測試結論來看,Archive表比MyISAM表要小大約75%,比支持事務處理的InnoDB表小大約83%。
4、Blackhole引擎
Blackhole引擎沒有實現任何存儲機制,它會丟棄所有插入的數據,不做任何保存。但服務器會記錄Blackhole表的日志,所以可以用于復制數據到備庫,或者簡單地記錄到日志。但這種應用方式會碰到很多問題,因此并不推薦。
5、CSV引擎
CSV引擎可以將普通的CSV文件作為MySQL的表來處理,但不支持索引。 CSV引擎可以作為一種數據交換的機制,非常有用。
CSV存儲的數據直接可以在操作系統里,用文本編輯器,或者excel讀取。
6、Memory引擎
如果需要快速地訪問數據,并且這些數據不會被修改,重啟以后丟失也沒有關系,那么使用Memory表是非常有用。Memory表至少比MyISAM表要快一個數量級。
7、Federated引擎
Federated引擎是訪問其他MySQL服務器的一個代理,盡管該引擎看起來提供了一種很好的跨服務器的靈活性,但也經常帶來問題,因此默認是禁用的。
四、MyISAM與InnoDB對比
總結
- 上一篇: Redis主从复制(读写分离)
- 下一篇: 系统间数据传输,产品经理视角的9千字总结