成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

增刪改查這么多年,最后栽在MySQL的架構設計上

數據庫 新聞
在學習任何知識前,先不要著急的陷入細節,而是先了解大致脈絡,形成一個全局觀,之后再去深入了解相關的細節。

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

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

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

圖片

導致其在實際工作中碰到MySQL死鎖異常、SQL性能太差、異常報錯等問題時,直接百度搜索。

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

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

這樣大家碰到MySQL的一些異常或者問題時,能夠直戳本質,快速地定位解決。

一、連接管理

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

經過三次握手建立連接成功后,MySQL服務器對TCP傳輸過來的賬號密碼做身份認證、權限獲取。

  • 用戶名或密碼不對,會收到一個Access denied for user錯誤,客戶端程序結束執行;
  • 用戶名密碼認證通過,會從權限表查出賬號擁有的權限與連接關聯,之后的權限判斷邏輯,都將依賴于此時讀到的權限。

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

一個系統只會和MySQL服務器建立一個連接嗎?

只能有一個系統和MySQL服務器建立連接嗎?

當然不是,多個系統都可以和MySQL服務器建立連接,每個系統建立的連接肯定不止一個。

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

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

圖片

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

這些內容我們都歸納到MySQL的連接管理組件中。

所以連接管理的職責是負責認證、管理連接、獲取權限信息。

二、解析與優化

經過了連接管理,現在MySQL服務器已經獲取到SQL字符串。

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

去緩存中獲取,命中緩存,直接返回結果(返回前需要做權限驗證),未命中執行后面的階段,這個步驟叫查詢緩存。

圖片

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

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

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

因為系統發送過來的只是一段文本字符串,所以MySQL服務器要按照SQL語法對這段文本進行解析。

圖片

?

如果你的SQL字符串不符合語法規范,就會收到You have an error in your SQL syntax錯誤提醒。

通過了分析器,說明SQL字符串符合語法規范,現在MySQL服務器要執行SQL語句了。

MySQL服務器要怎么執行呢?

你需要產出執行計劃,交給MySQL服務器執行,所以來到了優化器階段。

圖片

優化器不僅僅只是生成執行計劃這么簡單,這個過程它會幫你優化SQL語句。

如外連接轉換為內連接、表達式簡化、子查詢轉為連接、連接順序、索引選擇等,優化的結果就是執行計劃。

截止到現在,還沒有真正去讀寫真實的表,僅僅只是產出了一個執行計劃。

于是就進入了執行器階段,MySQL服務器終于要執行SQL語句了。

圖片

開始執行的時候,要先判斷一下對這個表有沒有相應的權限,如果沒有,就會返回權限錯誤。

如果有權限,根據執行計劃調用存儲引擎API對表進行讀寫。

圖片

存儲引擎API只是抽象接口,下面還有個存儲引擎層,具體實現還是要看表選擇的存儲引擎。

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

所以解析與優化的職責如下:

  • 緩存
  • SQL語法解析驗證
  • SQL優化并生成執行計劃
  • 根據執行計劃調用存儲引擎接口

圖片

?

其中連接管理與解析與優化處于MySQL架構中的Server層。

三、小結

在學習任何知識前,先不要著急的陷入細節,而是先了解大致脈絡,形成一個全局觀,之后再去深入了解相關的細節。

MySQL架構分為Server層與存儲引擎層。

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

通過這種架構設計,我們發現Server層其實就是公用層,存儲引擎層就是多態層,按需選擇具體的存儲引擎。

再細想下,它和模板方法設計模式一摸一樣,它們的執行流程是固定的,Server層等于公用模板函數,存儲引擎層等于抽象模板函數,按需子類實現。

最后以一張MySQL簡化版的架構圖結束本文。

? 圖片 ?

責任編輯:張燕妮 來源: 程序猿阿星
相關推薦

2015-03-27 10:20:41

谷歌地圖谷歌偉大

2018-10-07 06:30:40

代碼設計模式面向對象原則

2020-07-28 15:18:52

Gartner信息安全網絡安全

2023-11-13 08:49:54

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2022-04-21 07:52:08

JS線程GUI渲染

2024-03-01 17:01:15

GraphQL后端

2019-11-07 15:39:36

數據庫MySQL文章

2018-10-06 21:51:37

代碼SOLID編程

2021-04-27 15:13:20

Java開發語言

2021-09-13 10:03:54

藍牙連接藍牙藍牙設備

2017-08-21 15:10:30

筆記本塑料材質工藝

2021-02-03 08:24:32

JavaScript技巧經驗

2024-05-23 10:34:15

CSS 3CSS技術

2021-12-16 10:16:18

硬盤WindowsiPhone

2017-11-30 07:30:27

程序員代碼軟件世界觀

2023-02-27 07:37:56

Curl操作SQL

2020-03-30 16:18:02

代碼開發工具

2019-03-11 08:33:04

攜號轉網運營商網絡

2023-06-08 08:13:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人午夜视频 | 亚洲国产成人精品女人久久久 | 久久精品一区 | 欧美在线小视频 | 欧美一区不卡 | 亚洲国产一区视频 | 特级做a爰片毛片免费看108 | 欧美一区二区三区国产 | 欧美精品久久久久 | 精品免费国产一区二区三区 | 毛片大全| 国产日韩欧美二区 | 91精品国产91久久久久久三级 | 免费在线观看av的网站 | 一区精品视频在线观看 | 国产精品视频一区二区三区 | 国产免费一区 | 日本在线中文 | 一级片免费在线观看 | 色偷偷人人澡人人爽人人模 | 蜜臀av日日欢夜夜爽一区 | 欧洲尺码日本国产精品 | 亚洲一区二区精品视频 | 91免费入口 | 国产一区二区在线播放 | 极品粉嫩国产48尤物在线播放 | 免费的黄色片子 | 国产精品成人一区二区 | 日韩精品在线免费 | 精品视频在线播放 | 亚洲网站在线观看 | 一区二区精品 | 99热电影| 欧美日韩在线成人 | xxx国产精品视频 | 久国产精品 | 亚洲国产精品久久久久婷婷老年 | 欧美性猛片aaaaaaa做受 | 国产电影一区二区 | 毛片一区二区三区 | 一区二区三区国产 |