溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣分析MySQL體系架構(gòu)

發(fā)布時(shí)間:2021-10-25 10:49:35 來源:億速云 閱讀:138 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)怎樣分析MySQL體系架構(gòu),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

要了解mysql的運(yùn)行機(jī)制,那么首先要對(duì)mysql的體系結(jié)構(gòu)有一定的了解。

最近由于一些事,被打擊的不輕,感覺自己可能再怎么努力,職業(yè)生涯也就這樣了。所以對(duì)專研技術(shù)、寫博客突然喪失了原來的激情。

但不管怎樣,路是自己選的,哭著也要走完。何況,目前好像也沒有其他路可走。

 

mysql體系結(jié)構(gòu)

怎樣分析MySQL體系架構(gòu)  
mysql體系結(jié)構(gòu)

由圖,可以看出MySQL由一下幾部分組成:

  • 連接池組件

  • 管理服務(wù)和工具組件

  • SQL接口組件

  • 查詢分析器組件

  • 優(yōu)化器組件

  • 緩沖(Cache)組件

  • 插件式存儲(chǔ)引擎

  • 物理文件

說明:
MySql數(shù)據(jù)庫區(qū)別于其他數(shù)據(jù)庫的最重要的一個(gè)特點(diǎn)就是其插件式的表存儲(chǔ)引擎。
需要注意:
    存儲(chǔ)引擎是基于表的,而不是基于數(shù)據(jù)庫。

基于這樣的特性,針對(duì)在項(xiàng)目中的業(yè)務(wù)數(shù)據(jù)庫,大部分大多數(shù)需要支持事務(wù)屬性,所以采用的使用InnoDB存儲(chǔ)引擎。但是針對(duì)那些只讀特性的表,我們可以考慮使用MyISAM存儲(chǔ)引擎,這樣并不會(huì)破壞數(shù)據(jù)庫的事務(wù)特性。

 

詳細(xì)說明

最上層是連接組件。下面服務(wù)器是由連接池、管理工具和服務(wù)、SQL接口、解析器、優(yōu)化器、緩存、存儲(chǔ)引擎、文件系統(tǒng)組成。

連接池:由于每次建立建立需要消耗很多時(shí)間,連接池的作用就是將這些連接緩存下來,下次可以直接用已經(jīng)建立好的連接,提升服務(wù)器性能。
管理工具和服務(wù):系統(tǒng)管理和控制工具,例如備份恢復(fù)、Mysql復(fù)制、集群等
SQL接口:接受用戶的SQL命令,并且返回用戶需要查詢的結(jié)果。比如select from就是調(diào)用SQL Interface
查詢解析器: SQL命令傳遞到解析器的時(shí)候會(huì)被解析器驗(yàn)證和解析(權(quán)限、語法結(jié)構(gòu))
主要功能:
a . 將SQL語句分解成數(shù)據(jù)結(jié)構(gòu),并將這個(gè)結(jié)構(gòu)傳遞到后續(xù)步驟,以后SQL語句的傳遞和處理就是基于這個(gè)結(jié)構(gòu)的
b. 如果在分解構(gòu)成中遇到錯(cuò)誤,那么就說明這個(gè)sql語句是不合理的
查詢優(yōu)化器:查詢優(yōu)化器,SQL語句在查詢之前會(huì)使用查詢優(yōu)化器對(duì)查詢進(jìn)行優(yōu)化。他使用的是“選取-投影-聯(lián)接”策略進(jìn)行查詢。
用一個(gè)例子就可以理解:select uid,name from user where gender = 1;
這個(gè)select 查詢先根據(jù)where 語句進(jìn)行選取,而不是先將表全部查詢出來以后再進(jìn)行g(shù)ender過濾
這個(gè)select查詢先根據(jù)uid和name進(jìn)行屬性投影,而不是將屬性全部取出以后再進(jìn)行過濾
將這兩個(gè)查詢條件聯(lián)接起來生成最終查詢結(jié)果。

此外查詢優(yōu)化器還能控制一個(gè)sql語句查詢具體走哪一個(gè)索引,自動(dòng)調(diào)整sql語句中where條件的順序,來滿足復(fù)合索引最左匹配原則的規(guī)則。

緩存器:查詢緩存(MySQL 8.0 版本后移除),如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)。
通過LRU算法將數(shù)據(jù)的冷端溢出,未來得及時(shí)刷新到磁盤的數(shù)據(jù)頁,叫臟頁。
這個(gè)緩存機(jī)制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權(quán)限緩存等

MySQL 查詢不建議使用緩存,因?yàn)椴樵兙彺媸г趯?shí)際業(yè)務(wù)場(chǎng)景中可能會(huì)非常頻繁,假如你對(duì)一個(gè)表更新的話,這個(gè)表上的所有的查詢緩存都會(huì)被清空。
所以,一般在大多數(shù)情況下我們都是不推薦去使用查詢緩存的。
MySQL 8.0 版本后刪除了緩存的功能,官方也是認(rèn)為該功能在實(shí)際的應(yīng)用場(chǎng)景比較少,所以干脆直接刪掉了。

插入式存儲(chǔ)引擎 :存儲(chǔ)引擎說白了就是如何管理操作數(shù)據(jù)(存儲(chǔ)數(shù)據(jù)、如何更新、查詢數(shù)據(jù)等)的一種方法。因?yàn)樵陉P(guān)系數(shù)據(jù)庫中數(shù)據(jù)的存儲(chǔ)是以表的形式存儲(chǔ)的,所以存儲(chǔ)引擎也可以稱為表類型(即存儲(chǔ)和操作此表的類型)

物理文件
物理文件包括:日志文件,數(shù)據(jù)文件,配置文件,pid文件,socket文件等

 

一個(gè)查詢語句的執(zhí)行流程

說了以上這么多,那么究竟一條 sql 語句是如何執(zhí)行的呢?其實(shí)我們的 sql 可以分為兩種,一種是查詢,一種是更新(增加,更新,刪除)。我們先分析下查詢語句,語句如下:

select * from tb_student  A where A.age='18' and A.name=' 張三 ';
 

結(jié)合上面的說明,我們分析下這個(gè)語句的執(zhí)行流程:
1、建立連接
2、調(diào)用sql接口
3、鑒權(quán):先檢查該語句是否有權(quán)限,如果沒有權(quán)限,直接返回錯(cuò)誤信息
4、緩存判斷:如果有權(quán)限,在 MySQL8.0 版本以前,會(huì)先查詢緩存,以這條 sql 語句為 key 在內(nèi)存中查詢是否有結(jié)果,如果有直接緩存,如果沒有,執(zhí)行下一步。
5、解析sql語句:
通過分析器進(jìn)行詞法分析,提取 sql 語句的關(guān)鍵元素,比如提取上面這個(gè)語句是查詢 select,提取需要查詢的表名為 tb_student,需要查詢所有的列,查詢條件是這個(gè)表的 id=‘1’。然后判斷這個(gè) sql 語句是否有語法錯(cuò)誤,比如關(guān)鍵詞是否正確等等,如果檢查沒問題就執(zhí)行下一步。
6、查詢優(yōu)化對(duì)sql語句進(jìn)行sql
接下來就是優(yōu)化器進(jìn)行確定執(zhí)行方案,上面的 sql 語句,可以有兩種執(zhí)行方案:
 a. 先查詢學(xué)生表中姓名為“張三”的學(xué)生,然后判斷是否年齡是 18。
 b. 先找出學(xué)生中年齡 18 歲的學(xué)生,然后再查詢姓名為“張三”的學(xué)生。
 那么優(yōu)化器根據(jù)自己的優(yōu)化算法進(jìn)行選擇執(zhí)行效率最好的一個(gè)方案(優(yōu)化器認(rèn)為,有時(shí)候不一定最好)。確認(rèn)了執(zhí)行計(jì)劃后就準(zhǔn)備開始執(zhí)行了。

7、執(zhí)行查詢,返回結(jié)果

 

物理文件說明

1、日志文件

怎樣分析MySQL體系架構(gòu)  

 

error log     錯(cuò)誤日志       排錯(cuò)          /var/log/mysqld.log【默認(rèn)開啟】  
bin log       二進(jìn)制日志    備份          增量備份 DDL DML DCL  
Relay log   中繼日志        復(fù)制            接收 replication master  
slow log     慢查詢?nèi)罩?    調(diào)優(yōu)         查詢時(shí)間超過指定值


日志文件的默認(rèn)位置:
Error Log
log-error=/var/log/mysqld.log
Binary Log
log-bin=/var/log/mysql-bin/bin.log
server-id=2 5.7.x版本后
Slow Query Log
slow_query_log=1|0
slow_query_log_file=/var/log/mysql-slow/slow.log
long_query_time=3

2、配置文件
/etc/my.cnf—>/etc/mysql/my.cnf—>/usr/etc/my.cnf—> ~/.my.cnf
如果沖突,以最后一個(gè)讀取的為準(zhǔn)
[mysqld]組中包括了mysqld服務(wù)啟動(dòng)時(shí)的初始化參數(shù)
[client]組中包含著客戶端工具程序可以讀取的參數(shù),此外還有其他針對(duì)各個(gè)客戶端軟件的特定參數(shù)組等

3、數(shù)據(jù)文件
1、.frm文件
不論是什么存儲(chǔ)引擎,每一個(gè)表都會(huì)有一個(gè)以表名命名的.frm文件,與表相關(guān)的元數(shù)據(jù)(meta)信息都存放在此文件中,包括表結(jié)構(gòu)的定義信息等。
2、.MYD文件
myisam存儲(chǔ)引擎專用,存放myisam表的數(shù)據(jù)(data)。每一個(gè)myisam表都會(huì)有一個(gè).MYD文件與之呼應(yīng),同樣存放在所屬數(shù)據(jù)庫的目錄下
3、.MYI文件
也是myisam存儲(chǔ)引擎專用,存放myisam表的索引相關(guān)信息。對(duì)于myisam存儲(chǔ)引擎來說,可以被緩存(cache)的內(nèi)容主要就是來源于.MYI文件中。
每一個(gè)myisam表對(duì)應(yīng)一個(gè).MYI文件,其存放的位置和.frm及.MYD一樣
4、.ibd文件和ibdata文件
存放innoDB的數(shù)據(jù)文件(包括索引)。innoDB存儲(chǔ)引擎有兩種表空間方式:獨(dú)享表空間和共享表空間。
獨(dú)享表空間:使用.ibd文件來存放數(shù)據(jù),且每個(gè)表一個(gè).ibd文件,文件存放在和myisam數(shù)據(jù)相同的位置。
共享表空間:使用.ibdata文件,所有表共同使用一個(gè)(或多個(gè),自行配置)ibdata文件。

ibdata1:系統(tǒng)表空間(數(shù)據(jù)文件)undo 段
ib_logfile0   redlog文件  一組
ib_logfile1

db.opt文件    此文件在每一個(gè)自建的庫里都會(huì)有,記錄這個(gè)庫的默認(rèn)使用的字符集和校驗(yàn)規(guī)。

4、pid文件
pid文件是mysqld應(yīng)用程序在Unix/Linux環(huán)境下的一個(gè)進(jìn)程文件,和許多其他Unix/Linux服務(wù)端程序一樣,它存放著自己的進(jìn)程id

5、socket文件
socket文件也是在Unix/Linux環(huán)境下才有的,用戶在Unix/Linux環(huán)境下客戶端連接可以不通過TCP/IP網(wǎng)絡(luò)而直接使用Unix Socket來連接mysql.

 

數(shù)據(jù)庫、數(shù)據(jù)庫實(shí)例、數(shù)據(jù)庫服務(wù)器

數(shù)據(jù)庫(database):
操作系統(tǒng)或存儲(chǔ)上的數(shù)據(jù)文件的集合。mysql數(shù)據(jù)庫中,數(shù)據(jù)庫文件可以是* .frm、.MYD、.MYI、*.ibd等結(jié)尾的文件,不同存儲(chǔ)引擎文件類型不同。
更偏向文件的存儲(chǔ)方面。
數(shù)據(jù)庫實(shí)例(instance)
由后臺(tái)進(jìn)程或者線程以及一個(gè)共享內(nèi)存區(qū)組成。共享內(nèi)存可以被運(yùn)行的后臺(tái)線程所共享。
需要注意:數(shù)據(jù)庫實(shí)例才是真正操作數(shù)據(jù)庫的。
更偏向應(yīng)用操作方面。

數(shù)據(jù)庫和數(shù)據(jù)庫實(shí)例的關(guān)系:
通常情況下,數(shù)據(jù)庫實(shí)例和數(shù)據(jù)庫是一一對(duì)應(yīng)的關(guān)系,也就是一個(gè)數(shù)據(jù)庫實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)庫;
但是,在集群環(huán)境中存在多個(gè)數(shù)據(jù)庫實(shí)例共同使用一個(gè)數(shù)據(jù)庫。
比如一個(gè)數(shù)據(jù)庫里面的表,經(jīng)過分表策略,可以分散在多個(gè)數(shù)據(jù)庫實(shí)例中。
數(shù)據(jù)庫實(shí)例指的是數(shù)據(jù)庫應(yīng)用,數(shù)據(jù)庫指的是在數(shù)據(jù)庫實(shí)例上面創(chuàng)建的database。
比如在服務(wù)器上部署了一個(gè)3306端口的mysql應(yīng)用,那么就是一個(gè)數(shù)據(jù)庫實(shí)例;
如果繼續(xù)部署一個(gè)3309的mysql應(yīng)用,那么就是在一個(gè)服務(wù)上部署了2個(gè)msql的實(shí)例。
在3306端口的mysql實(shí)例上,創(chuàng)建一個(gè)名為order的database,就是創(chuàng)建了一個(gè)數(shù)據(jù)庫。

數(shù)據(jù)庫服務(wù)器(database server)
部署安裝數(shù)據(jù)庫實(shí)例的服務(wù)器。

 

總結(jié)

1、mysql體系結(jié)構(gòu),主要包括連接池組件、管理服務(wù)和工具組件
SQL接口組件、查詢分析器組件、優(yōu)化器組件、緩沖(Cache)組件、插件式存儲(chǔ)引擎
物理文件。
2、分析一個(gè)查詢語句的執(zhí)行過程:建立連接—》權(quán)限校驗(yàn)—》查詢緩存—》分析器—》優(yōu)化器—》權(quán)限校驗(yàn)—》執(zhí)行器—》引擎
3、區(qū)分?jǐn)?shù)據(jù)庫、數(shù)據(jù)庫實(shí)例、數(shù)據(jù)庫服務(wù)器

【開心一刻】

怎樣分析MySQL體系架構(gòu)    

關(guān)于怎樣分析MySQL體系架構(gòu)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI