精通MySQL之架構篇
老劉是即將找工作的研究生,自學大資料開發,一路走來,感慨頗深,網上大資料的資料良莠不齊,於是想寫一份詳細的大資料開發指南。這份指南把大資料的【基礎知識】【框架分析】【原始碼理解】都用自己的話描述出來,讓夥伴自學從此不求人。 大資料開發指南地址如下:
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架構內容,對各個模組以及流程進行了詳細介紹,希望大家能夠跟著老劉的文章,好好捋捋思路,爭取能夠用自己的話把這些知識點講述出來!
儘管當前水平可能不及各位大佬,但老劉會努力變得更加優秀,讓各位小夥伴自學從此不求人!
如果有相關問題,聯絡公眾號:努力的老劉。文章都看到這了,點贊關注支援一波!