自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

增刪改查這么多年,最后栽在MySQL的架構(gòu)設(shè)計(jì)上

數(shù)據(jù)庫 新聞
在學(xué)習(xí)任何知識前,先不要著急的陷入細(xì)節(jié),而是先了解大致脈絡(luò),形成一個(gè)全局觀,之后再去深入了解相關(guān)的細(xì)節(jié)。

目前大部分后端開發(fā)人員對MySQL的理解可能停留在一個(gè)黑盒子階段。

對MySQL的基本使用沒什么問題,比如建庫、建表、建索引,執(zhí)行各種增刪改查等。

所以很多后端開發(fā)人員眼中的MySQL如下圖所示:

圖片

導(dǎo)致其在實(shí)際工作中碰到MySQL死鎖異常、SQL性能太差、異常報(bào)錯(cuò)等問題時(shí),直接百度搜索。

然后跟著博客搗鼓就解決了,可能自己都沒搞明白里面的原理。

為了解決這種知其然而不知其所以然的問題,本文將帶著大家探索MySQL底層原理。

這樣大家碰到MySQL的一些異?;蛘邌栴}時(shí),能夠直戳本質(zhì),快速地定位解決。

一、連接管理

系統(tǒng)(客戶端)訪問MySQL服務(wù)器前,做的第一件事就是建立TCP連接。

經(jīng)過三次握手建立連接成功后,MySQL服務(wù)器對TCP傳輸過來的賬號密碼做身份認(rèn)證、權(quán)限獲取。

  • 用戶名或密碼不對,會收到一個(gè)Access denied for user錯(cuò)誤,客戶端程序結(jié)束執(zhí)行;
  • 用戶名密碼認(rèn)證通過,會從權(quán)限表查出賬號擁有的權(quán)限與連接關(guān)聯(lián),之后的權(quán)限判斷邏輯,都將依賴于此時(shí)讀到的權(quán)限。

接著我們來思考以下問題:

一個(gè)系統(tǒng)只會和MySQL服務(wù)器建立一個(gè)連接嗎?

只能有一個(gè)系統(tǒng)和MySQL服務(wù)器建立連接嗎?

當(dāng)然不是,多個(gè)系統(tǒng)都可以和MySQL服務(wù)器建立連接,每個(gè)系統(tǒng)建立的連接肯定不止一個(gè)。

所以,為了解決TCP無限創(chuàng)建與TCP頻繁創(chuàng)建銷毀帶來的資源耗盡、性能下降問題。

MySQL服務(wù)器里有專門的TCP連接池限制接數(shù),采用長連接模式復(fù)用TCP連接,來解決上述問題。

圖片

TCP連接收到請求后,必須要分配給一個(gè)線程去執(zhí)行,所以還會有個(gè)線程池,去走后面的流程。

這些內(nèi)容我們都?xì)w納到MySQL的連接管理組件中。

所以連接管理的職責(zé)是負(fù)責(zé)認(rèn)證、管理連接、獲取權(quán)限信息。

二、解析與優(yōu)化

經(jīng)過了連接管理,現(xiàn)在MySQL服務(wù)器已經(jīng)獲取到SQL字符串。

如果是查詢語句,MySQL服務(wù)器會使用select SQL字符串作為key。

去緩存中獲取,命中緩存,直接返回結(jié)果(返回前需要做權(quán)限驗(yàn)證),未命中執(zhí)行后面的階段,這個(gè)步驟叫查詢緩存。

圖片

需要注意,select SQL字符串要完全匹配,有任何不同的地方都會導(dǎo)致緩存不被命中(空格、注釋、大小寫、某些系統(tǒng)函數(shù))。

小貼士:雖然查詢緩存有時(shí)可以提升系統(tǒng)性能,但也不得不因維護(hù)這塊緩存而造成一些開銷,從MySQL 5.7.20開始,不推薦使用查詢緩存,并在MySQL 8.0中刪除。

沒有命中緩存,或者非select SQL就來到分析器階段了。

因?yàn)橄到y(tǒng)發(fā)送過來的只是一段文本字符串,所以MySQL服務(wù)器要按照SQL語法對這段文本進(jìn)行解析。

圖片

?

如果你的SQL字符串不符合語法規(guī)范,就會收到Y(jié)ou have an error in your SQL syntax錯(cuò)誤提醒。

通過了分析器,說明SQL字符串符合語法規(guī)范,現(xiàn)在MySQL服務(wù)器要執(zhí)行SQL語句了。

MySQL服務(wù)器要怎么執(zhí)行呢?

你需要產(chǎn)出執(zhí)行計(jì)劃,交給MySQL服務(wù)器執(zhí)行,所以來到了優(yōu)化器階段。

圖片

優(yōu)化器不僅僅只是生成執(zhí)行計(jì)劃這么簡單,這個(gè)過程它會幫你優(yōu)化SQL語句。

如外連接轉(zhuǎn)換為內(nèi)連接、表達(dá)式簡化、子查詢轉(zhuǎn)為連接、連接順序、索引選擇等,優(yōu)化的結(jié)果就是執(zhí)行計(jì)劃。

截止到現(xiàn)在,還沒有真正去讀寫真實(shí)的表,僅僅只是產(chǎn)出了一個(gè)執(zhí)行計(jì)劃。

于是就進(jìn)入了執(zhí)行器階段,MySQL服務(wù)器終于要執(zhí)行SQL語句了。

圖片

開始執(zhí)行的時(shí)候,要先判斷一下對這個(gè)表有沒有相應(yīng)的權(quán)限,如果沒有,就會返回權(quán)限錯(cuò)誤。

如果有權(quán)限,根據(jù)執(zhí)行計(jì)劃調(diào)用存儲引擎API對表進(jìn)行讀寫。

圖片

存儲引擎API只是抽象接口,下面還有個(gè)存儲引擎層,具體實(shí)現(xiàn)還是要看表選擇的存儲引擎。

講到這里,上面提到的查詢緩存、分析器、優(yōu)化器、執(zhí)行器都可以歸納到MySQL的解析與優(yōu)化組件中。

所以解析與優(yōu)化的職責(zé)如下:

  • 緩存
  • SQL語法解析驗(yàn)證
  • SQL優(yōu)化并生成執(zhí)行計(jì)劃
  • 根據(jù)執(zhí)行計(jì)劃調(diào)用存儲引擎接口

圖片

?

其中連接管理與解析與優(yōu)化處于MySQL架構(gòu)中的Server層。

三、小結(jié)

在學(xué)習(xí)任何知識前,先不要著急的陷入細(xì)節(jié),而是先了解大致脈絡(luò),形成一個(gè)全局觀,之后再去深入了解相關(guān)的細(xì)節(jié)。

MySQL架構(gòu)分為Server層與存儲引擎層。

連接管理、解析與優(yōu)化這些并不涉及讀寫表數(shù)據(jù)的組件劃分到Server層,讀寫表數(shù)據(jù)而是交給存儲引擎層來做。

通過這種架構(gòu)設(shè)計(jì),我們發(fā)現(xiàn)Server層其實(shí)就是公用層,存儲引擎層就是多態(tài)層,按需選擇具體的存儲引擎。

再細(xì)想下,它和模板方法設(shè)計(jì)模式一摸一樣,它們的執(zhí)行流程是固定的,Server層等于公用模板函數(shù),存儲引擎層等于抽象模板函數(shù),按需子類實(shí)現(xiàn)。

最后以一張MySQL簡化版的架構(gòu)圖結(jié)束本文。

? 圖片 ?

責(zé)任編輯:張燕妮 來源: 程序猿阿星
相關(guān)推薦

2015-03-27 10:20:41

谷歌地圖谷歌偉大

2018-10-07 06:30:40

代碼設(shè)計(jì)模式面向?qū)ο笤瓌t

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2020-07-28 15:18:52

Gartner信息安全網(wǎng)絡(luò)安全

2023-11-13 08:49:54

2022-04-21 07:52:08

JS線程GUI渲染

2024-03-01 17:01:15

GraphQL后端

2019-11-07 15:39:36

數(shù)據(jù)庫MySQL文章

2017-08-21 15:10:30

筆記本塑料材質(zhì)工藝

2018-10-06 21:51:37

代碼SOLID編程

2021-04-27 15:13:20

Java開發(fā)語言

2021-09-13 10:03:54

藍(lán)牙連接藍(lán)牙藍(lán)牙設(shè)備

2021-12-16 10:16:18

硬盤WindowsiPhone

2023-02-27 07:37:56

Curl操作SQL

2021-02-03 08:24:32

JavaScript技巧經(jīng)驗(yàn)

2024-05-23 10:34:15

CSS 3CSS技術(shù)

2020-03-30 16:18:02

代碼開發(fā)工具

2023-06-08 08:13:43

2017-11-30 07:30:27

程序員代碼軟件世界觀

2021-07-05 09:24:06

MySQL SQL 語句數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號