久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL邏輯架構(gòu)是什么

145次閱讀
沒有評論

共計 4827 個字符,預(yù)計需要花費 13 分鐘才能閱讀完成。

MySQL 邏輯架構(gòu)是什么,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

邏輯架構(gòu)圖:

我們把上面的圖簡化一下,就有了如下所示的 MySQL 簡易的邏輯架構(gòu),稍后我們會詳細(xì)分析每一個組件。

MySQL 從整體上可以分為 Server 層和存儲引擎層。

Server 層

大多數(shù)的 MySQL 的核心服務(wù)功能都是在 Server 層,它包括連接器、查詢緩存、解析器、優(yōu)化器、執(zhí)行器。

Server 層涵蓋了 MySQL 的大部分功能,包括查詢解析、分析、優(yōu)化、緩存以及所有的內(nèi)置函數(shù) (例如:日期、時間、數(shù)學(xué)和加密函數(shù)),所有跨存儲引擎的功能都在這一層實現(xiàn):存儲過程、觸發(fā)器、視圖等。

連接器

每個客戶端連接都會在服務(wù)器進(jìn)程中擁有一個線程,這個連接的查詢只會在這個單獨的線程中執(zhí)行。

當(dāng)客戶端應(yīng)用連接到 MySQL 服務(wù)器時,首先接待它的就是連接器。連接器負(fù)責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接。

連接 MySQL 服務(wù)器的命令:

mysql -h$ip -P$port -u$user -p

輸完命令之后,會提示我們輸入密碼,也可以將密碼寫在 - p 后面,但是這樣會存在密碼泄漏的風(fēng)險。

如果根據(jù)我們輸入的用戶名和密碼無法連接到服務(wù)器,我們能看到如下的報錯:

[root@codegirl ~]# mysql -hlocalhost -P3306 -uroot -p Enter password: ERROR 1045 (28000): Access denied for user  root @ localhost  (using password: YES)

這個報錯信息就是連接器返回的。

所以當(dāng)我們通過客戶端命令 mysql 與服務(wù)器建立連接時,連接器做了兩件事情:

認(rèn)證用戶名和密碼,如果認(rèn)證失敗,我們就收到了上述 1045 的異常,客戶端程序就結(jié)束了執(zhí)行。如果認(rèn)證成功,客戶端就與服務(wù)器建立了連接。

連接成功之后,連接器會繼續(xù)驗證用戶的權(quán)限,比如我們有哪些表的查詢權(quán)限,哪些表的修改權(quán)限,或者是授權(quán)權(quán)限。之后這個連接中的權(quán)限判斷邏輯,都是基于此時讀到的權(quán)限。所以如果修改了權(quán)限,一定要記得重新連接!

連接器的連接又分為長連接和短連接。

長連接:連接成功后,如果客戶端持續(xù)有請求,則一直使用通過一個連接。

短連接:每次執(zhí)行完很少的幾次查詢就斷開連接,下次查詢再重新建立一個連接。

建立連接的過程比較復(fù)雜,現(xiàn)在絕大部分的服務(wù)都是使用的長連接。

如果建立連接之后,客戶端一直沒有請求,這個時候連接就會斷開。這個時間由參數(shù) wait_timeout 控制,默認(rèn)為 8 小時。

查看 MySQL 的連接時間設(shè)置:

mysql  show variables like  wait_timeout%

超時時間的設(shè)置單位為秒,28800/60/60 = 8h;

查詢緩存

建立連接之后,我們就可以執(zhí)行 sql 語句了。

select 查詢語句:

mysql  select * from user where id = 1;

它不是直接去查詢表里的數(shù)據(jù),而是先查詢緩存,如果緩存中存在則直接返回緩存中的數(shù)據(jù),緩存中不存在再去表里查詢數(shù)據(jù),然后將查詢到的結(jié)果添加到緩存里。

這個邏輯就像是我們?yōu)榱藴p輕數(shù)據(jù)庫的壓力加了 Redis 緩存一樣。如果緩存存在,就不需要后面的解析和執(zhí)行步驟,效率會大大提高。

MySQL 緩存的數(shù)據(jù)是以 key-value 的形式存在的,key 就是我們的查詢 sql 語句,value 就是這個 sql 語句對應(yīng)的查詢結(jié)果。

那這個時候我們不禁會想,數(shù)據(jù)庫的數(shù)據(jù)如果經(jīng)常變更是不是緩存需要及時失效,這樣在下次查詢的時候我們就可以獲取到最新的數(shù)據(jù)了。

是的,MySQL 只要表的數(shù)據(jù)或者表結(jié)構(gòu)有變化,這張表的所有緩存都會失效。所以如果是一張經(jīng)常涉及到增刪改的表,緩存并沒有太多實際的意義,可能剛加了緩存接下來就更新了,費了老大勁加的緩存又失效了。但是如果我們的表是系統(tǒng)配置這類的靜態(tài)表,緩存就能起到作用。

在開發(fā)中,如果我們測試某個 sql 的執(zhí)行時間,首先要確定緩存是否可用。查詢緩存是否可用的命令:

mysql  show variables like  %have_query_cache%

緩存是默認(rèn)可用的:

修改緩存的配置,我們可以修改 MySQL 的配置文件:/etc/my.cnf,添加配置:query_cache_type=0;

其中可選項為:0、1、2;0 代表不使用緩存,1 代表使用緩存,2 代表根據(jù)需要使用。

也可以使用命令:

mysql  set global query_cache_type = 0;

查看緩存是否開啟:

mysql  select @@query_cache_type;

 

如果關(guān)閉緩存之后,某些 sql 語句我們希望能使用緩存,我們可以通過 SQL_CACHE 顯式的指定 sql 使用緩存。

mysql  select SQL_CACHE * from user;

MySQL8.0 版本已經(jīng)完全把緩存刪除了,對于緩存這一組件我們只需了解。在使用不同版本的 MySQL 時需要注意緩存對性能的影響。

解析器

開始真正執(zhí)行 sql 語句時,解析器會先分析我們輸入的 sql 語句,MySQL 解析器將 sql 語句解析成內(nèi)部數(shù)據(jù)結(jié)構(gòu) (解析樹),然后優(yōu)化器就可以對其優(yōu)化。

我們給解析器的 sql 語句是字符串和空格組成的,解析器第一步是解析出來字符串,識別出里面的每個字符串代表的意思。

解析器會識別 sql 關(guān)鍵字,從而知道我們是在查詢還是更新。解析器將字符串 user 識別為表名字,把字符串 id 識別為列。解析器識別了字符串之后,就開始校驗我們給的字符串是否符合語法規(guī)范。

解析器會驗證語法,還會根據(jù)解析到的表和列驗證表和列是否存在。

如果表或者列不存在,或者語法有問題,我們可以收到錯誤信息。

mysql  select * from aa where id =1; 

ERROR 1146 (42S02): Table  test.aa  doesn t exist 


mysql  select * fromuser where id=1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near  fromuser where id=1  at line 1

  優(yōu)化器

經(jīng)過解析器處理,得到了解析樹。這個時候 MySQL 已經(jīng)明確知道自己要做什么了,但是在開始執(zhí)行之前還會對 sql 進(jìn)行優(yōu)化。

優(yōu)化器對 sql 語句的優(yōu)化包括:重寫查詢、決定表的讀寫順序、選擇合適的索引等。

優(yōu)化器涉及的內(nèi)容比較多,我們先對它有個初步印象,后續(xù)我們再詳細(xì)了解它。

經(jīng)過優(yōu)化器之后,sql 語句的執(zhí)行方案就已經(jīng)確定了,解析來就進(jìn)入執(zhí)行器開始執(zhí)行了。

執(zhí)行器

執(zhí)行器執(zhí)行 sql 語句的時候,會先驗證是否有對這個表的權(quán)限,如果沒有權(quán)限就會返回沒有權(quán)限的錯誤信息。如果有權(quán)限,則會打開表繼續(xù)執(zhí)行。打開表的時候,執(zhí)行器就會根據(jù)表的執(zhí)行引擎,去使用執(zhí)行引擎提供的接口。

存儲引擎

存儲引擎層負(fù)責(zé)數(shù)據(jù)的存儲和提取。存儲引擎是插件式的,支持 InnoDB、MyISAM、Memory 等多種存儲引擎,MySQL 也提供了一些第三方的存儲引擎,這種插件式的結(jié)構(gòu)設(shè)計,使得不同的公司可以根據(jù)自己的需求選擇不同的引擎。

現(xiàn)在最常用的存儲引擎是 InnoDB,它是 MySQL5.5.5 版本之后默認(rèn)的存儲引擎,如果我們在建表時不指定存儲引擎類型,默認(rèn)使用的就是 InnoDB。

不同的存儲引擎是公用 Server 層的,區(qū)分 Server 層和引擎層的功能對于后面我們學(xué)習(xí)鎖和事務(wù)比較重要。

不同的引擎保存數(shù)據(jù)和索引的方式是不相同的,但是表的定義是 MySQL 服務(wù)層負(fù)責(zé)的,這個是一致的。

今天我們只分析兩種常見的存儲引擎 InnoDB 和 MyISAM,其他的引擎小伙伴感興趣可以查看相關(guān)文檔。

InnoDB

我們先看一下 user 表的信息,它的存儲引擎是 InnoDB。

mysql  show table status like  user  \G *************************** 1. row *************************** Name: user #表名  Engine: InnoDB #存儲引擎類型  Version: 10 Row_format: Dynamic #行的格式,如果表中包含了可變長度的字段比如 Varchar,那么就是 Dynamic Rows: 0 #行數(shù),對于 InnoDB 引擎來說,這是預(yù)估值  Avg_row_length: 0 #平均每行包含的字節(jié)數(shù)  Data_length: 16384 #表數(shù)據(jù)的大小(字節(jié)) Max_data_length: 0 #表數(shù)據(jù)的最大容量,和引擎有關(guān)  Index_length: 0 #所以的大小(字節(jié)) Data_free: 0 Auto_increment: NULL #下一個自增長的值  Create_time: 2021-02-16 14:24:46 Update_time: NULL Check_time: NULL Collation: utf8_general_ci # 默認(rèn)字符集  Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)

InnoDB 的數(shù)據(jù)存儲在表空間中,它將每個表的數(shù)據(jù)和索引存放在單獨的文件中。lsquo;user rsquo; 表在磁盤上有兩個數(shù)據(jù)文件:

.frm 文件:表示表的定義,由 MySQL 的 server 層定義。

.ibd 文件:數(shù)據(jù)和索引文件。

InnoDB 采用的是 MVCC 多版本控制來支持高并發(fā)。并且它實現(xiàn)了四個標(biāo)準(zhǔn)的事務(wù)隔離級別,其默認(rèn)的隔離級別是可重復(fù)讀。它支持行鎖,并且通過間隙鎖策略防止幻讀的出現(xiàn)。

InnoDB 是基于聚簇索引建立的,對基于主鍵的查詢有很高的性能。

MyISAM

我們先看一下 user_isam 表的信息,它的存儲引擎為 MyISAM。

mysql  show table status like  user_isam  \G *************************** 1. row *************************** Name: user_isam Engine: MyISAM Version: 10 Row_format: Dynamic Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 281474976710655 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2021-02-16 16:36:25 Update_time: 2021-02-16 16:36:25 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)

MyISAM 會將表存儲在兩個文件中:數(shù)據(jù)文件和索引文件。

.frm 文件:表示表的定義,由 MySQL 的 server 層定義。

.MYD 文件:表示數(shù)據(jù)文件。

.MYI 文件:表示索引文件。

MyISAM 提供了很多特性,但是它不支持事務(wù)和行鎖,它是對整張表加鎖,而且崩潰后無法安全恢復(fù),這也是它被 InnoDB 取代的原因。

關(guān)于 MySQL 邏輯架構(gòu)是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-01發(fā)表,共計4827字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 浦城县| 黑水县| 乌苏市| 霍邱县| 抚宁县| 迭部县| 横山县| 河曲县| 林西县| 沙雅县| 台南县| 永福县| 广元市| 黑龙江省| 溧阳市| 瑞丽市| 龙泉市| 剑河县| 宁海县| 洛川县| 盐山县| 曲阜市| 安平县| 日照市| 美姑县| 绥滨县| 靖西县| 石屏县| 于田县| 化德县| 商都县| 南和县| 张北县| 苏尼特左旗| 吉首市| 鹿邑县| 南漳县| 高阳县| 措美县| 沭阳县| 沛县|