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

MySQL是什么?它的架構(gòu)是怎樣的?假如讓你重新設(shè)計(jì),你要怎么做?

數(shù)據(jù)庫 MySQL
服務(wù)層是 MySQL 中的核心組件,負(fù)責(zé)提供各種數(shù)據(jù)庫操作所需的基本功能,如 SQL 語法處理、事務(wù)管理、鎖管理等。

重生

當(dāng)我醒來睜開眼睛的時(shí)候,我看到辦公桌的電腦長(zhǎng)這個(gè)樣子。

啥情況,我猝死了還是穿越了?還在我一臉懵逼的時(shí)候……

系統(tǒng)提示:蕭劍臣,你已經(jīng) dead 過一次了,現(xiàn)在在另一個(gè)世界獲得重生,你需要在這個(gè)世界完成一個(gè)任務(wù),設(shè)計(jì)一款數(shù)據(jù)庫 MySQL,就能就能回到原來的世界,迎娶白富美,脫離 996,并且在這個(gè)世界的成就也能帶回原來的世界。

打開這個(gè)電腦一看,時(shí)間是 1979 年。那時(shí) Bill Gates 退學(xué)沒多久,微軟公司也才剛剛起步,世間還沒有 996 和福報(bào),沒有過勞猝死……

這個(gè)狗血,我居然重生了,我的機(jī)會(huì)來了……

1990 年,我接到了一個(gè)項(xiàng)目,客戶需要為當(dāng)時(shí)的 UNIREG 提供更加通用的 SQL 接口,公司的另一個(gè)團(tuán)隊(duì)負(fù)責(zé)人「郝紀(jì)曉」提議直接使用商用數(shù)據(jù)庫。

重生后的第一個(gè)副本出現(xiàn)了,我不能讓「郝紀(jì)曉」的提議達(dá)成,否則將永遠(yuǎn) 「狗 dead」。

經(jīng)過一番測(cè)試后,我發(fā)現(xiàn)商用數(shù)據(jù)庫的速度并不盡如人意,無法滿足客戶的需求。于是我聯(lián)合 Monty Widenius,他雄心大起,設(shè)計(jì)一個(gè)數(shù)據(jù)庫的任務(wù)就此開始……

MySQL 架構(gòu)設(shè)計(jì)

腦子里有 MySQL 8.0 版本的架構(gòu)設(shè)計(jì)思路,我在這里豈不是如魚得水,起飛,起飛,必須起飛。于是我把 MySQL 的架構(gòu)設(shè)計(jì)圖畫了出來,如圖 1-1 所示。

圖片圖片

看到如此層級(jí)的架構(gòu)設(shè)計(jì),分層明確,職責(zé)清晰,眾人驚呆了!!

郝紀(jì)曉不懈的說到:劃分這么多層,有什么意義?該不會(huì)是脫褲子放屁多此一舉吧。

我心想,難道這是副第一個(gè)關(guān)卡出現(xiàn)的一個(gè) boss,我看了看他的工牌,上面寫著資深架構(gòu)師——郝紀(jì)曉。

系統(tǒng)提示音:新手任務(wù),畫出 MySQL 系統(tǒng)架構(gòu)設(shè)計(jì)圖,并解釋每一層以及每層組件的主要作用,讓眾人理解并清晰認(rèn)識(shí)該架構(gòu),讓大家按照此架構(gòu)開發(fā)。

好家伙,這個(gè)任務(wù)難度不大,我自信的給眾人解釋到:這個(gè)數(shù)據(jù)庫名叫 MySQL,至上而下一共分為四層,重點(diǎn)是 Server 服務(wù)層和存儲(chǔ)引擎層。

客戶端由不同語言開發(fā)的客戶端,Server 層包括連接池、安全管理、線程管理、緩存、SQL 接口、解析器、優(yōu)化器等,涵蓋了 MySQL 的大多數(shù)核心功能。

而存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)的讀取。這是一個(gè)插件式架構(gòu),支持 InnoDB、MyISAM、Memory 等多個(gè)存儲(chǔ)引擎。

客戶端 Client

這是一個(gè) CS 架構(gòu),支持各種語言的客戶端連接器連接到數(shù)據(jù)庫,比如 Java、C++、JDBC 等。同時(shí)也支持 Shell 腳本直接連接。

Server 服務(wù)層

這一層至關(guān)重要,里面還還會(huì)劃分為「連接與安全管理」和「SQL 解析和優(yōu)化」兩大模塊。

服務(wù)層是 MySQL 中的核心組件,負(fù)責(zé)提供各種數(shù)據(jù)庫操作所需的基本功能,如 SQL 語法處理、事務(wù)管理、鎖管理等。

連接與安全管理

當(dāng)客戶端發(fā)送連接請(qǐng)求時(shí),MySQL 服務(wù)器會(huì)在連接與安全管理接收請(qǐng)求,分配一個(gè)線程來處理該連接,隨后進(jìn)行身份驗(yàn)證。具體的功能如下:

  • 當(dāng)客戶端發(fā)起連接請(qǐng)求時(shí),MySQL 會(huì)創(chuàng)建一個(gè)專用的線程(以操作系統(tǒng)級(jí)別的線程實(shí)現(xiàn))來為該客戶端服務(wù)。
  • MYSQL 對(duì) TCP 傳輸過來的賬號(hào)密碼做身份認(rèn)證、權(quán)限獲?。ɡ?,是否允許客戶端對(duì) world 數(shù)據(jù)庫中的 Country 表執(zhí)行 SELECT 語句)。驗(yàn)證通過,查詢賬戶擁有的權(quán)限,并緩存起來。此鏈接是一個(gè)長(zhǎng)鏈接
  • 對(duì)于 TCP 鏈接,MySQL 采用池化技術(shù),節(jié)省了 TCP 鏈接創(chuàng)建和銷毀的成本。
  • 一個(gè)客戶端請(qǐng)求,必須要分配一個(gè)線程專門與客戶端進(jìn)行交互,所以還有個(gè)線程池,每一個(gè)鏈接從線程池中獲取一個(gè)線程,省去了創(chuàng)建和銷毀線程的開銷。把線程池占滿了,再連就報(bào)連接滿了。

SQL 解析和優(yōu)化

SQL Interface(SQL 接口,用來接受用戶的 SQL 命令,并返回需要的結(jié)果。比如 select from 就是調(diào)用 SQL Interface。

Parse 解析器

MySQL 解析查詢以創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)(解析樹),然后對(duì)其進(jìn)行各種優(yōu)化,包括重寫查詢、決定表的讀取順序,以及選擇合適的索引等。

Optimizer 優(yōu)化器

通過語法解析,MySQL 知道你的真實(shí)意圖了,但你寫的 SQL 不一定是高效的。

查詢之前會(huì)使用查詢優(yōu)化器確定 SQL 語句的執(zhí)行路徑,生成一個(gè)執(zhí)行計(jì)劃,這個(gè)執(zhí)行計(jì)劃表明使用哪些索引進(jìn)行查詢。

Caches & Buffers 緩沖區(qū)

MySQL 內(nèi)部維持著一些 Cache 和 Buffer,這個(gè)緩存機(jī)制是由一系列小緩存組成的。比如表緩存,記錄緩存,key 緩存,權(quán)限緩存等。這個(gè)查詢緩存可以在 不同客戶端之間共享。

  1. 查詢緩存:當(dāng)相同的 SQL 查詢被多次執(zhí)行時(shí),可以從查詢緩存中直接獲取結(jié)果,提高性能。由于 MySQL 8.0 中已移除了查詢緩存功能,使用者需要自行實(shí)現(xiàn)相關(guān)功能,如使用 Redis、Memcached 等中間緩存系統(tǒng)。
  2. 表緩存:用于存儲(chǔ)表的元數(shù)據(jù),如表的結(jié)構(gòu)定義。當(dāng)查詢需要表信息時(shí),優(yōu)先從表緩存中獲取,避免磁盤操作。
  3. 線程緩存:用于復(fù)用服務(wù)器的連接線程。當(dāng)一個(gè)連接關(guān)閉后,它的線程會(huì)被放回線程緩存池中,供新的連接使用。線程池意味著減少了創(chuàng)建和銷毀線程的開銷。
  4. 緩沖池:主要用于 InnoDB 存儲(chǔ)引擎,緩沖池管理緩存的數(shù)據(jù)頁,包括數(shù)據(jù)和索引。當(dāng)需要訪問這些頁時(shí),可以直接從緩沖池讀取,提高訪問速度。

buffer 與 cache 的區(qū)別?

簡(jiǎn)單的說就是,buffer 是寫緩存,cache 是讀緩存。

存儲(chǔ)引擎層

存儲(chǔ)引擎層負(fù)責(zé)存儲(chǔ)數(shù)據(jù)和執(zhí)行 SQL 語句。MySQL 支持多種存儲(chǔ)引擎,每種引擎各有特點(diǎn),根據(jù)實(shí)際需求進(jìn)行選用。當(dāng)然,只要沒有非常明確的特殊需求就不需要更改存儲(chǔ)引擎,因?yàn)?InnoDB 在大部分場(chǎng)景下都比其他引擎更加適用。

InnoDB:InnoDB 是 MySQL 的默認(rèn)存儲(chǔ)引擎,提供了事務(wù)支持、行級(jí)鎖定、外鍵約束等功能,主要用于高并發(fā)、高可靠性的 OLTP 場(chǎng)景。

MyISAM:MyISAM 通常用于只讀數(shù)據(jù)表,適用于簡(jiǎn)單查詢和全文索引。其不支持事務(wù)、行級(jí)鎖等功能,適用于 OLAP 場(chǎng)景。

Memory:Memory 存儲(chǔ)引擎支持哈希和 B 樹索引,它將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,易受到系統(tǒng)斷電或宕機(jī)等影響,具有較高的寫性能但不適用于大規(guī)模數(shù)據(jù)分布。

其他存儲(chǔ)引擎:MySQL 還支持如 Archive、NDB Cluster 等其他存儲(chǔ)引擎,它們分別適用于存檔表、分布式數(shù)據(jù)庫等不同場(chǎng)景。

我們可以在 SQL 命令行中執(zhí)行 show engines; 來查看當(dāng)前支持的存儲(chǔ)引擎:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

文件系統(tǒng)層

文件系統(tǒng)由各操作系統(tǒng)提供,MySQL 將其持久化的數(shù)據(jù)物理存儲(chǔ)在磁盤上,持久化保存數(shù)據(jù)、索引、binlog、redo log、undo log、error 日志、慢 sql 等;

總結(jié)

  • 服務(wù)層的連接和安全管理:用戶與 MYSQL 服務(wù)進(jìn)行 TCP 鏈接,校驗(yàn)用戶身份,用戶權(quán)限。
  • 服務(wù)層的 SQL 解析和優(yōu)化:用戶寫的 SQL 語句會(huì)到服務(wù)層進(jìn)行解析,生成語法樹。優(yōu)化 SQL 語句,生成執(zhí)行計(jì)劃。
  • 引擎層:真正與磁盤進(jìn)行交互,對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和讀取。

最后,我再附上一張?jiān)谖以瓉淼氖澜缬绕涫⑿械募軜?gòu)圖,與 圖 1-1 最大的差別是這次用英文,如圖 1-2 所示。

圖片圖片

我說完之后,眾人紛紛對(duì)我稱贊。CTO 覺得我的架構(gòu)設(shè)計(jì)考慮的太周全了,立馬從 T3 晉升為 T4,薪資漲了 20%……

故事還沒結(jié)束,結(jié)構(gòu)圖出來以后,郝紀(jì)曉說道:架構(gòu)圖雖然不錯(cuò),可是還有很多問題并沒提及,我們是實(shí)干主義,不是寫個(gè)架構(gòu)圖就能忽悠的。

  1. 一條查詢、insert、update、delete 語句的執(zhí)行流程是怎樣的?
  2. 并發(fā)如何控制?
  3. 事務(wù)如何處理?
  4. Server 層與存儲(chǔ)引擎層之間如何保證故障恢復(fù)?
  5. binlog、redo log、undo log 都是什么玩意?
  6. 磁盤很慢,如何將 讀寫的隨機(jī) I/O 操作變成順序?qū)懕WC 數(shù)據(jù)庫性能?
責(zé)任編輯:武曉燕 來源: 碼哥跳動(dòng)
相關(guān)推薦

2020-12-23 13:22:14

Kubernetes設(shè)計(jì)網(wǎng)絡(luò)

2019-06-17 09:49:27

裁員失業(yè)品牌

2021-09-05 18:25:57

文件系統(tǒng)

2024-08-28 08:38:51

2023-08-16 14:18:15

AI人工智能

2021-05-13 07:32:17

培訓(xùn)代碼同事

2022-03-05 18:25:51

SSLTLS協(xié)議

2020-05-15 09:55:09

設(shè)計(jì)技術(shù)棧程序員

2018-07-18 16:10:29

2023-08-28 08:52:49

監(jiān)聽頁面用戶

2018-08-20 20:46:07

2018-11-30 16:19:03

App啟動(dòng)SDK

2015-09-02 11:44:39

視頻云華為

2021-01-14 05:23:32

高并發(fā)消息中間件

2018-09-28 08:53:25

服務(wù)器架構(gòu)訪問量

2023-01-15 17:57:12

緩存技術(shù)kafka磁盤

2018-02-28 15:39:52

2022-09-19 18:14:58

分布式架構(gòu)中間件

2011-03-11 09:53:46

FacebookMySQL

2020-07-28 08:09:02

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)
點(diǎn)贊
收藏

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