老劉是即將找工作的研究生,自學大數據開發,一路走來,感慨頗深,網上大數據的資料良莠不齊,於是想寫一份詳細的大數據開發指南。這份指南把大數據的【基礎知識】【框架分析】【源碼理解】都用自己的話描述出來,讓伙伴自學從此不求人。 大數據開發指南地址如下:
github:https://github.com/BigDataLaoLiu/BigDataGuide 碼雲:https://gitee.com/BigDataLiu/BigDataGuide 您的點贊是我持續更新的動力,禁止白嫖,看了就要有收獲,有需要聯系公眾號:努力的老劉。
今天給大家分享的是大數據開發基礎部分MySQL的第一篇,老劉講點和別人不一樣的內容!眾多伙伴都知道MySQL的基礎知識以及使用,但是對里面的原理知道的不多,咱們學知識只看表面絕對是不行的,所以老劉爭取把MySQL的架構知識給大家講明白!
MySQL架構篇的大綱如下:
看完老劉這篇內容后,希望你們能夠掌握以下內容:
-
Mysql的各組件及各組件的功能 -
Mysql簡版執行流程和詳細執行流程 -
MyIsam和InnoDB的區別並說明使用場景 -
Mysql各個日志文件的概念和相關作用
一、邏輯架構
邏輯架構圖
首先分享出MySQL邏輯架構圖,我們可以看到MySQL是由很多模塊組合而成,各個模塊都發揮着重要的作用,下面分別介紹各個模塊的概念及其作用。
連接器
Connectors,它指的是和不同的語言中的SQL進行交互。
系統管理和控制工具
它的作用是備份集群和集群管理。
連接池
管理連接,進行權限驗證之類的。
SQL接口
接收SQL命令(比如DDL、DML)后,返回用戶需要查詢的結果。但是接收到SQL命令后,我們需要把它變為有意義的SQL,要被系統識別出來你這個SQL要干什么,就需要對SQL語句進行解析,所以就需要Parser解析器。
解析器
解析分為詞法解析和語法解析,舉例說明詞法解析和語法解析。
SQL命令傳到解析器后會被解析器驗證和解析,先進行詞法分析,分詞形成select、*、from、t1,解析完成之后形成一顆語法樹,在進行語法分析,分析SQL語句對不對,如果不對,說明這個SQL語句不合理。
查詢優化器
在上一步語法正確后會傳到這一部分,SQL語句在真正執行之前,MySQL會認為你的語句不是最優的,它會對它進行優化。其中使用explain查看的SQL語句執行計划,就是查詢優化器生成的!
例如:select * from tuser where name like 'a%' and id = 1;
這句話就會進行優化,至於為什么會優化,后面會講到,先知道就行,會變為這樣的語句。
select * from tuser where name id = 1 and like 'a%';
查詢緩存
把查詢的結果存起來,但它針對的不是SQL語句,而是SQL語句經過哈希后的值。如果下次有相同查詢結果,就不會到Pluggable Shortage Engines儲存引擎,直接在緩存中把查詢結果拿出來。(現在作用不大,在新的MySQL被去掉了,不用了)
存儲引擎
可插拔的存儲引擎,也就是MySQL數據庫提供了多種存儲引擎。它就是用來存儲數據的,如何為存儲的數據建立索引和如何更新之類。
在MySQL中,主要的存儲引擎有兩種:MyIsam和InnoDB。
MyIsam是高速引擎,擁有較高的插入、查詢速度。但不支持事務、行鎖等;
InnoDB是5.5版本后MySQL默認的數據庫,支持事務和行級鎖定,事務處理、回滾、崩潰修復能力和多版本並發控制,比MyIsam處理速度稍慢,支持外鍵。
那我們如何選擇存儲引擎類型呢?
InnoDB:支持事務處理,支持外鍵,支持崩潰修復能力和並發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現並發控制(比如售票),那一般都會選擇InnoDB。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇InnoDB,因為它支持事務的提交和回滾。
MyIsam:插入數據快,空間和內存使用比較低。如果表主要是用於插入新紀錄和讀出記錄,那么選擇MyIsam能實現處理高效率。
下面老劉放一張MyIsam和InnoDB區別的圖:
簡版執行流程圖
如何記住執行流程圖?根據邏輯架構圖各模塊的執行順序來記!
-
客戶端:發送命令到連接器,連接器進行權限驗證,權限驗證通過后,客戶端就可以繼續發SQL命令了。 -
連接器:負責跟客戶端建立連接,獲取權限。 -
如果用戶名或密碼不對,會收到一個“Access denied for user”的錯誤。 -
如果用戶名和密碼通過,連接器就會進入權限表里面查找你擁有的權限。
-
-
查詢緩存:連接建立完成后,就可以執行select語句,執行邏輯來到第二步:查詢緩存,如果之前緩存過結果,就直接返回。 -
分析器:如果沒有命中查詢緩存,就要開始真正執行語句,先做詞法分析,再做語法分析。 -
優化器:經過了分析器,MySQL就知道了你要干什么了,在開始執行之前,還要經過優化器處理。優化器是在表里面有多個索引的時候,決定使用哪個索引。 -
執行器:通過分析器知道你要干什么,通過優化器知道該怎么做,於是現在進入執行器,開始執行語句。注意:在開始執行的時候,要先判斷一下你對這個表有沒有執行的權限,有權限就繼續執行,沒有權限就返回。如果有權限就打開表繼續執行,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。
詳版執行流程圖
說完簡版的執行流程圖,感覺差不多就可以了。但是當初學習的時候,還有一個詳細版執行流程圖,老劉也好好說說流程。
-
MySQL啟動后,網絡交互模塊會在連接管理模塊等連接,連接上來以后,會進入連接進程模塊,再到用戶模塊,看你有沒有用戶權限,如果權限通過,就會把信息返回到連接管理模塊,就可以登錄了。 -
接下來MySQL語句發下來到用戶模塊,用戶模塊還要檢查你有沒有操作表的權限,有權限就會到命令分發器,然后發到查詢緩存模塊。如果之前查過,就直接把結果返回(同時命令到達命令分發器,命令下來以后先去日志記錄模塊,記錄日志)。 -
緊接着命令到達命令解析器,看它是什么語句,根據不同類型的語句,進入到不同模塊的優化器,優化器類型有:查詢優化器、表變更模塊、表維護模塊、復制模塊、狀態模塊。 -
SQL語句現在到達訪問控制模塊,再次看一下有沒有權限,看你有沒有操作權限(insert權限,update權限之類的),如果這個權限沒有問題,就會進入到表管理模塊,調用存儲引擎接口,然后調完以后,存儲引擎向下拿數據(就是在文件系統里拿數據),再往回返。
到這一步,邏輯架構圖就講完了,大家可以好好捋捋思路和邏輯,一下就能記住。
二、物理結構
MySQL從物理結構上可以分為日志文件和數據索引文件,它在Linux中的數據索引文件和日志文件都在/var/lib/mysql目錄下,並且日志文件采用順序IO方式進行存儲,而數據文件采用隨機IO方式進行存儲。
在這個地方提個問題:為什么日志文件采用順序IO方式進行存儲而數據文件采用隨機IO進行存儲?
-
首先簡單說說順序IO和隨機IO,順序IO在物理上是一塊連續的存儲空間,在進行順序追加內容時,效率非常高。而隨機IO從邏輯上看是連續的,物理上不是連續的,在對內容進行操作時,每次都需要找到文件在磁盤的位置。 -
老劉簡單說一下,順序IO存儲的優勢是記錄速度快,數據只能追加,這個就特別適合日志文件,因為日志文件特點也非常明顯,記錄日志信息,也不需要修改數據之類的,缺點就是浪費空間。數據文件可能經常需要修改之類的,存儲的地址不是連續的,這個特別特別適合用隨機IO,而且隨機IO省空間,就是速度有點慢
日志文件
下面開始介紹日志文件中的各個日志,只介紹那些
錯誤日志(errorlog)
默認開啟,記錄每次運行過程中遇到的所有嚴重錯誤信息,以及MySQL每次啟動和關閉的詳細信息。
二進制日志(binlog)
這個太重要了,大家一定要記住!
默認關閉,它記錄數據庫中所有DDL語句和DML語句,但不包括select語句內容。DDL語句直接記錄到binlog中,而DML語句必須通過事務提交才能提交到binlog中,它主要用於實現mysql主從復制、數據備份、數據恢復、
通用查詢日志(general query log)
默認是關閉的,它會記錄用戶的所有操作,其中還包含增刪改查等信息,在並發操作大的情況下會產生大量的信息,從而導致不必要的磁盤IO,會影響mysql性能。
慢查詢日志(slow query log)
默認關閉,記錄執行時間超過long_query_time秒的所有查詢,收集查詢時間比較長的SQL語句,可以用來提高查詢性能。
重做日志(redo log)
它主要用來確保事務的持久性。防止在發生故障的時間點,尚有臟頁未寫入磁盤,在重啟mysql服務的時候,根據redo log進行重做,從而達到事務的持久性這一特性。
回滾日志(undo log)
它保存了事務發生之前的數據的一個版本,可以用於回滾,同時可以提供多版本並發控制下的讀(MVCC)。
中繼日志(relay log)
關於這個,老劉知道兩個地方有用到它,一是mysql主從復制,二是canal同步mysql增量數據。主要就是從服務器I/O線程將主服務器的二進制日志讀取過來記錄到從服務器本地文件,然后從服務器SQL線程會讀取relay-log日志的內容並應用到從服務器,從而使從服務器和主服務器的數據保持一致。
數據文件
InnoDB數據文件
-
.frm文件:主要存放與表相關的數據信息,主要包括表結構的定義信息。 -
.ibd文件:使用表獨享表空間存儲表數據和索引信息,一張表對應一個ibd文件。 -
.bdata文件:使用共享表空間存儲表數據和索引信息,所有表共同使用一個或多個ibdata文件
MyIsam數據文件
-
.frm文件:主要存放與表相關的數據信息,主要包括表結構的定義信息。 -
.myd文件:主要用來存儲表數據信息。 -
.myi文件:主要用來存儲表數據文件中任何索引的數據樹。
總結
本文作為大數據開發指南MySQL的第一篇詳細介紹了MySQL架構內容,對各個模塊以及流程進行了詳細介紹,希望大家能夠跟着老劉的文章,好好捋捋思路,爭取能夠用自己的話把這些知識點講述出來!
盡管當前水平可能不及各位大佬,但老劉會努力變得更加優秀,讓各位小伙伴自學從此不求人!
如果有相關問題,聯系公眾號:努力的老劉。文章都看到這了,點贊關注支持一波!
