老劉是即將找工作的研究生,自學(xué)大數(shù)據(jù)開發(fā),一路走來,感慨頗深,網(wǎng)上大數(shù)據(jù)的資料良莠不齊,于是想寫一份詳細(xì)的大數(shù)據(jù)開發(fā)指南。這份指南把大數(shù)據(jù)的【基礎(chǔ)知識(shí)】【框架分析】【源碼理解】都用自己的話描述出來,讓伙伴自學(xué)從此不求人。
大數(shù)據(jù)開發(fā)指南地址如下:
github:https://github.com/BigDataLaoLiu/BigDataGuide
碼云:https://gitee.com/BigDataLiu/BigDataGuide
您的點(diǎn)贊是我持續(xù)更新的動(dòng)力,禁止白嫖,看了就要有收獲,有需要聯(lián)系公眾號(hào):努力的老劉。
今天給大家分享的是大數(shù)據(jù)開發(fā)基礎(chǔ)部分MySQL的第一篇,老劉講點(diǎn)和別人不一樣的內(nèi)容!眾多伙伴都知道MySQL的基礎(chǔ)知識(shí)以及使用,但是對(duì)里面的原理知道的不多,咱們學(xué)知識(shí)只看表面絕對(duì)是不行的,所以老劉爭(zhēng)取把MySQL的架構(gòu)知識(shí)給大家講明白!
MySQL架構(gòu)篇的大綱如下:

看完老劉這篇內(nèi)容后,希望你們能夠掌握以下內(nèi)容:
Mysql的各組件及各組件的功能
Mysql簡(jiǎn)版執(zhí)行流程和詳細(xì)執(zhí)行流程
MyIsam和InnoDB的區(qū)別并說明使用場(chǎng)景
Mysql各個(gè)日志文件的概念和相關(guān)作用
一、邏輯架構(gòu)
邏輯架構(gòu)圖
首先分享出MySQL邏輯架構(gòu)圖,我們可以看到MySQL是由很多模塊組合而成,各個(gè)模塊都發(fā)揮著重要的作用,下面分別介紹各個(gè)模塊的概念及其作用。
連接器
Connectors,它指的是和不同的語(yǔ)言中的SQL進(jìn)行交互。
系統(tǒng)管理和控制工具
它的作用是備份集群和集群管理。
連接池
管理連接,進(jìn)行權(quán)限驗(yàn)證之類的。
SQL接口
接收SQL命令(比如DDL、DML)后,返回用戶需要查詢的結(jié)果。但是接收到SQL命令后,我們需要把它變?yōu)橛幸饬x的SQL,要被系統(tǒng)識(shí)別出來你這個(gè)SQL要干什么,就需要對(duì)SQL語(yǔ)句進(jìn)行解析,所以就需要Parser解析器。
解析器
解析分為詞法解析和語(yǔ)法解析,舉例說明詞法解析和語(yǔ)法解析。
SQL命令傳到解析器后會(huì)被解析器驗(yàn)證和解析,先進(jìn)行詞法分析,分詞形成select、*、from、t1,解析完成之后形成一顆語(yǔ)法樹,在進(jìn)行語(yǔ)法分析,分析SQL語(yǔ)句對(duì)不對(duì),如果不對(duì),說明這個(gè)SQL語(yǔ)句不合理。
查詢優(yōu)化器
在上一步語(yǔ)法正確后會(huì)傳到這一部分,SQL語(yǔ)句在真正執(zhí)行之前,MySQL會(huì)認(rèn)為你的語(yǔ)句不是最優(yōu)的,它會(huì)對(duì)它進(jìn)行優(yōu)化。其中使用explain查看的SQL語(yǔ)句執(zhí)行計(jì)劃,就是查詢優(yōu)化器生成的!
例如:select?*?from?tuserwherename?like'a%'and?id?=?1;
這句話就會(huì)進(jìn)行優(yōu)化,至于為什么會(huì)優(yōu)化,后面會(huì)講到,先知道就行,會(huì)變?yōu)檫@樣的語(yǔ)句。
select?*?from?tuserwherename?id?=?1?and?like'a%';
查詢緩存
把查詢的結(jié)果存起來,但它針對(duì)的不是SQL語(yǔ)句,而是SQL語(yǔ)句經(jīng)過哈希后的值。如果下次有相同查詢結(jié)果,就不會(huì)到Pluggable Shortage Engines儲(chǔ)存引擎,直接在緩存中把查詢結(jié)果拿出來。(現(xiàn)在作用不大,在新的MySQL被去掉了,不用了)
存儲(chǔ)引擎
可插拔的存儲(chǔ)引擎,也就是MySQL數(shù)據(jù)庫(kù)提供了多種存儲(chǔ)引擎。它就是用來存儲(chǔ)數(shù)據(jù)的,如何為存儲(chǔ)的數(shù)據(jù)建立索引和如何更新之類。
在MySQL中,主要的存儲(chǔ)引擎有兩種:MyIsam和InnoDB。
MyIsam是高速引擎,擁有較高的插入、查詢速度。但不支持事務(wù)、行鎖等;
InnoDB是5.5版本后MySQL默認(rèn)的數(shù)據(jù)庫(kù),支持事務(wù)和行級(jí)鎖定,事務(wù)處理、回滾、崩潰修復(fù)能力和多版本并發(fā)控制,比MyIsam處理速度稍慢,支持外鍵。
那我們?nèi)绾芜x擇存儲(chǔ)引擎類型呢?
InnoDB:支持事務(wù)處理,支持外鍵,支持崩潰修復(fù)能力和并發(fā)控制。如果需要對(duì)事務(wù)的完整性要求比較高(比如銀行),要求實(shí)現(xiàn)并發(fā)控制(比如售票),那一般都會(huì)選擇InnoDB。如果需要頻繁的更新、刪除操作的數(shù)據(jù)庫(kù),也可以選擇InnoDB,因?yàn)樗С质聞?wù)的提交和回滾。
MyIsam:插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。如果表主要是用于插入新紀(jì)錄和讀出記錄,那么選擇MyIsam能實(shí)現(xiàn)處理高效率。
下面老劉放一張MyIsam和InnoDB區(qū)別的圖:
簡(jiǎn)版執(zhí)行流程圖
如何記住執(zhí)行流程圖?根據(jù)邏輯架構(gòu)圖各模塊的執(zhí)行順序來記!
客戶端:發(fā)送命令到連接器,連接器進(jìn)行權(quán)限驗(yàn)證,權(quán)限驗(yàn)證通過后,客戶端就可以繼續(xù)發(fā)SQL命令了。
連接器:負(fù)責(zé)跟客戶端建立連接,獲取權(quán)限。
如果用戶名或密碼不對(duì),會(huì)收到一個(gè)“Access denied for user”的錯(cuò)誤。
如果用戶名和密碼通過,連接器就會(huì)進(jìn)入權(quán)限表里面查找你擁有的權(quán)限。
查詢緩存:連接建立完成后,就可以執(zhí)行select語(yǔ)句,執(zhí)行邏輯來到第二步:查詢緩存,如果之前緩存過結(jié)果,就直接返回。
分析器:如果沒有命中查詢緩存,就要開始真正執(zhí)行語(yǔ)句,先做詞法分析,再做語(yǔ)法分析。
優(yōu)化器:經(jīng)過了分析器,MySQL就知道了你要干什么了,在開始執(zhí)行之前,還要經(jīng)過優(yōu)化器處理。優(yōu)化器是在表里面有多個(gè)索引的時(shí)候,決定使用哪個(gè)索引。
執(zhí)行器:通過分析器知道你要干什么,通過優(yōu)化器知道該怎么做,于是現(xiàn)在進(jìn)入執(zhí)行器,開始執(zhí)行語(yǔ)句。注意:在開始執(zhí)行的時(shí)候,要先判斷一下你對(duì)這個(gè)表有沒有執(zhí)行的權(quán)限,有權(quán)限就繼續(xù)執(zhí)行,沒有權(quán)限就返回。如果有權(quán)限就打開表繼續(xù)執(zhí)行,執(zhí)行器就會(huì)根據(jù)表的引擎定義,去使用這個(gè)引擎提供的接口。
詳版執(zhí)行流程圖
說完簡(jiǎn)版的執(zhí)行流程圖,感覺差不多就可以了。但是當(dāng)初學(xué)習(xí)的時(shí)候,還有一個(gè)詳細(xì)版執(zhí)行流程圖,老劉也好好說說流程。

MySQL啟動(dòng)后,網(wǎng)絡(luò)交互模塊會(huì)在連接管理模塊等連接,連接上來以后,會(huì)進(jìn)入連接進(jìn)程模塊,再到用戶模塊,看你有沒有用戶權(quán)限,如果權(quán)限通過,就會(huì)把信息返回到連接管理模塊,就可以登錄了。
接下來MySQL語(yǔ)句發(fā)下來到用戶模塊,用戶模塊還要檢查你有沒有操作表的權(quán)限,有權(quán)限就會(huì)到命令分發(fā)器,然后發(fā)到查詢緩存模塊。如果之前查過,就直接把結(jié)果返回(同時(shí)命令到達(dá)命令分發(fā)器,命令下來以后先去日志記錄模塊,記錄日志)。
緊接著命令到達(dá)命令解析器,看它是什么語(yǔ)句,根據(jù)不同類型的語(yǔ)句,進(jìn)入到不同模塊的優(yōu)化器,優(yōu)化器類型有:查詢優(yōu)化器、表變更模塊、表維護(hù)模塊、復(fù)制模塊、狀態(tài)模塊。
SQL語(yǔ)句現(xiàn)在到達(dá)訪問控制模塊,再次看一下有沒有權(quán)限,看你有沒有操作權(quán)限(insert權(quán)限,update權(quán)限之類的),如果這個(gè)權(quán)限沒有問題,就會(huì)進(jìn)入到表管理模塊,調(diào)用存儲(chǔ)引擎接口,然后調(diào)完以后,存儲(chǔ)引擎向下拿數(shù)據(jù)(就是在文件系統(tǒng)里拿數(shù)據(jù)),再往回返。
到這一步,邏輯架構(gòu)圖就講完了,大家可以好好捋捋思路和邏輯,一下就能記住。
二、物理結(jié)構(gòu)
MySQL從物理結(jié)構(gòu)上可以分為日志文件和數(shù)據(jù)索引文件,它在Linux中的數(shù)據(jù)索引文件和日志文件都在/var/lib/mysql目錄下,并且日志文件采用順序IO方式進(jìn)行存儲(chǔ),而數(shù)據(jù)文件采用隨機(jī)IO方式進(jìn)行存儲(chǔ)。
在這個(gè)地方提個(gè)問題:為什么日志文件采用順序IO方式進(jìn)行存儲(chǔ)而數(shù)據(jù)文件采用隨機(jī)IO進(jìn)行存儲(chǔ)?
首先簡(jiǎn)單說說順序IO和隨機(jī)IO,順序IO在物理上是一塊連續(xù)的存儲(chǔ)空間,在進(jìn)行順序追加內(nèi)容時(shí),效率非常高。而隨機(jī)IO從邏輯上看是連續(xù)的,物理上不是連續(xù)的,在對(duì)內(nèi)容進(jìn)行操作時(shí),每次都需要找到文件在磁盤的位置。
老劉簡(jiǎn)單說一下,順序IO存儲(chǔ)的優(yōu)勢(shì)是記錄速度快,數(shù)據(jù)只能追加,這個(gè)就特別適合日志文件,因?yàn)槿罩疚募攸c(diǎn)也非常明顯,記錄日志信息,也不需要修改數(shù)據(jù)之類的,缺點(diǎn)就是浪費(fèi)空間。數(shù)據(jù)文件可能經(jīng)常需要修改之類的,存儲(chǔ)的地址不是連續(xù)的,這個(gè)特別特別適合用隨機(jī)IO,而且隨機(jī)IO省空間,就是速度有點(diǎn)慢
日志文件
下面開始介紹日志文件中的各個(gè)日志,只介紹那些
錯(cuò)誤日志(errorlog)
默認(rèn)開啟,記錄每次運(yùn)行過程中遇到的所有嚴(yán)重錯(cuò)誤信息,以及MySQL每次啟動(dòng)和關(guān)閉的詳細(xì)信息。
二進(jìn)制日志(binlog)
這個(gè)太重要了,大家一定要記住!
默認(rèn)關(guān)閉,它記錄數(shù)據(jù)庫(kù)中所有DDL語(yǔ)句和DML語(yǔ)句,但不包括select語(yǔ)句內(nèi)容。DDL語(yǔ)句直接記錄到binlog中,而DML語(yǔ)句必須通過事務(wù)提交才能提交到binlog中,它主要用于實(shí)現(xiàn)mysql主從復(fù)制、數(shù)據(jù)備份、數(shù)據(jù)恢復(fù)、
通用查詢?nèi)罩荆╣eneral query log)
默認(rèn)是關(guān)閉的,它會(huì)記錄用戶的所有操作,其中還包含增刪改查等信息,在并發(fā)操作大的情況下會(huì)產(chǎn)生大量的信息,從而導(dǎo)致不必要的磁盤IO,會(huì)影響mysql性能。
慢查詢?nèi)罩荆╯low query log)
默認(rèn)關(guān)閉,記錄執(zhí)行時(shí)間超過long_query_time秒的所有查詢,收集查詢時(shí)間比較長(zhǎng)的SQL語(yǔ)句,可以用來提高查詢性能。
重做日志(redo log)
它主要用來確保事務(wù)的持久性。防止在發(fā)生故障的時(shí)間點(diǎn),尚有臟頁(yè)未寫入磁盤,在重啟mysql服務(wù)的時(shí)候,根據(jù)redo log進(jìn)行重做,從而達(dá)到事務(wù)的持久性這一特性。
回滾日志(undo log)
它保存了事務(wù)發(fā)生之前的數(shù)據(jù)的一個(gè)版本,可以用于回滾,同時(shí)可以提供多版本并發(fā)控制下的讀(MVCC)。
中繼日志(relay log)
關(guān)于這個(gè),老劉知道兩個(gè)地方有用到它,一是mysql主從復(fù)制,二是canal同步mysql增量數(shù)據(jù)。主要就是從服務(wù)器I/O線程將主服務(wù)器的二進(jìn)制日志讀取過來記錄到從服務(wù)器本地文件,然后從服務(wù)器SQL線程會(huì)讀取relay-log日志的內(nèi)容并應(yīng)用到從服務(wù)器,從而使從服務(wù)器和主服務(wù)器的數(shù)據(jù)保持一致。
數(shù)據(jù)文件
InnoDB數(shù)據(jù)文件
.frm文件:主要存放與表相關(guān)的數(shù)據(jù)信息,主要包括表結(jié)構(gòu)的定義信息。
.ibd文件:使用表獨(dú)享表空間存儲(chǔ)表數(shù)據(jù)和索引信息,一張表對(duì)應(yīng)一個(gè)ibd文件。
.bdata文件:使用共享表空間存儲(chǔ)表數(shù)據(jù)和索引信息,所有表共同使用一個(gè)或多個(gè)ibdata文件
MyIsam數(shù)據(jù)文件
.frm文件:主要存放與表相關(guān)的數(shù)據(jù)信息,主要包括表結(jié)構(gòu)的定義信息。
.myd文件:主要用來存儲(chǔ)表數(shù)據(jù)信息。
.myi文件:主要用來存儲(chǔ)表數(shù)據(jù)文件中任何索引的數(shù)據(jù)樹。
總結(jié)
本文作為大數(shù)據(jù)開發(fā)指南MySQL的第一篇詳細(xì)介紹了MySQL架構(gòu)內(nèi)容,對(duì)各個(gè)模塊以及流程進(jìn)行了詳細(xì)介紹,希望大家能夠跟著老劉的文章,好好捋捋思路,爭(zhēng)取能夠用自己的話把這些知識(shí)點(diǎn)講述出來!
盡管當(dāng)前水平可能不及各位大佬,但老劉會(huì)努力變得更加優(yōu)秀,讓各位小伙伴自學(xué)從此不求人!
如果有相關(guān)問題,聯(lián)系公眾號(hào):努力的老劉。文章都看到這了,點(diǎn)贊關(guān)注支持一波!
