0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL的底層原理和技術(shù)學(xué)習(xí)

Linux愛好者 ? 來源:冰河技術(shù) ? 作者:冰河技術(shù) ? 2021-04-06 16:51 ? 次閱讀

很多小伙伴工作很長時(shí)間了,對(duì)于MySQL的掌握程度卻僅僅停留在表面的CRUD,對(duì)于MySQL深層次的原理和技術(shù)知識(shí)了解的少之又少,隨著工作年限的不斷增長,職場競爭力卻是不斷降低的。很多時(shí)候,出去面試時(shí),被面試官吊打的現(xiàn)象成了家常便飯。

不僅僅是面試,如果你想從一名底層程序員上升為高級(jí)工程師、架構(gòu)師等,MySQL的底層原理和技術(shù)是你必須要掌握的。

今天一起來學(xué)習(xí)MySQL的體系架構(gòu)。

MySQL體系架構(gòu)

我們先來看看MySQL的體系架構(gòu)圖,如下所示。

注:圖片來自互聯(lián)網(wǎng)

從MySQL的架構(gòu)圖,我們可以看出MySQL的架構(gòu)自頂向下大致可以分為網(wǎng)絡(luò)連接層、數(shù)據(jù)庫服務(wù)層、存儲(chǔ)引擎層和系統(tǒng)文件層四大部分。接下來,我們就來簡單說說每個(gè)部分的組成信息

網(wǎng)絡(luò)連接層

網(wǎng)絡(luò)連接層位于整個(gè)MySQL體系架構(gòu)的最上層,主要擔(dān)任客戶端連接器的角色。提供與MySQL服務(wù)器建立連接的能力,幾乎支持所有主流的服務(wù)端語言,例如:Java、C、C++、Python等,各語言都是通過各自的API接口與MySQL建立連接。

數(shù)據(jù)庫服務(wù)層

數(shù)據(jù)庫服務(wù)層是整個(gè)數(shù)據(jù)庫服務(wù)器的核心,主要包括了系統(tǒng)管理和控制工具、連接池、SQL接口、解析器、查詢優(yōu)化器和緩存等部分。

連接池

主要負(fù)責(zé)存儲(chǔ)和管理客戶端與數(shù)據(jù)庫的連接信息,連接池里的一個(gè)線程負(fù)責(zé)管理一個(gè)客戶端到數(shù)據(jù)庫的連接信息。

系統(tǒng)管理和控制工具

提供數(shù)據(jù)庫系統(tǒng)的管理和控制功能,例如對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行備份和恢復(fù),保證整個(gè)數(shù)據(jù)庫的安全性,提供安全管理,對(duì)整個(gè)數(shù)據(jù)庫的集群進(jìn)行協(xié)調(diào)和管理等。

SQL接口

主要負(fù)責(zé)接收客戶端發(fā)送過來的各種SQL命令,并將SQL命令發(fā)送到其他部分,并接收其他部分返回的結(jié)果數(shù)據(jù),將結(jié)果數(shù)據(jù)返回給客戶端。

解析樹

主要負(fù)責(zé)對(duì)請(qǐng)求的SQL解析成一棵“解析樹”,然后根據(jù)MySQL中的一些規(guī)則對(duì)“解析樹”做進(jìn)一步的語法驗(yàn)證,確認(rèn)其是否合法。

查詢優(yōu)化器

在MySQL中,如果“解析樹”通過了解析器的語法檢查,此時(shí)就會(huì)由優(yōu)化器將其轉(zhuǎn)化為執(zhí)行計(jì)劃,然后與存儲(chǔ)引擎進(jìn)行交互,通過存儲(chǔ)引擎與底層的數(shù)據(jù)文件進(jìn)行交互。

緩存

MySQL的緩存是由一系列的小緩存組成的。例如:MySQL的表緩存,記錄緩存,MySQL中的權(quán)限緩存,引擎緩存等。MySQL中的緩存能夠提高數(shù)據(jù)的查詢性能,如果查詢的結(jié)果能夠命中緩存,則MySQL會(huì)直接返回緩存中的結(jié)果信息。

存儲(chǔ)引擎層

MySQL中的存儲(chǔ)引擎層主要負(fù)責(zé)數(shù)據(jù)的寫入和讀取,與底層的文件進(jìn)行交互。值得一提的是,MySQL中的存儲(chǔ)引擎是插件式的,服務(wù)器中的查詢執(zhí)行引擎通過相關(guān)的接口與存儲(chǔ)引擎進(jìn)行通信,同時(shí),接口屏蔽了不同存儲(chǔ)引擎之間的差異。MySQL中,最常用的存儲(chǔ)引擎就是InnoDB和MyISAM。

InnoDB和MyISAM存儲(chǔ)引擎需要小伙伴們重點(diǎn)掌握,高頻面試考點(diǎn),也是成為架構(gòu)師必知必會(huì)的內(nèi)容。

系統(tǒng)文件層

系統(tǒng)文件層主要包括MySQL中存儲(chǔ)數(shù)據(jù)的底層文件,與上層的存儲(chǔ)引擎進(jìn)行交互,是文件的物理存儲(chǔ)層。其存儲(chǔ)的文件主要有:日志文件、數(shù)據(jù)文件、配置文件、MySQL的pid文件和socket文件等。

日志文件

MySQL中的日志主要包括:錯(cuò)誤日志、通用查詢?nèi)罩?、二進(jìn)制日志、慢查詢?nèi)罩镜取?/p>

錯(cuò)誤日志

主要存儲(chǔ)的是MySQL運(yùn)行過程中產(chǎn)生的錯(cuò)誤信息??梢允褂孟旅娴腟QL語句來查看MySQL中的錯(cuò)誤日志。

showvariableslike'%log_error%';

通用查詢?nèi)罩?/p>

主要記錄MySQL運(yùn)行過程中的一般查詢信息,可以使用下面的SQL語句來查看MySQL中的通用查詢?nèi)罩疚募?/p>

showvariableslike'%general%';

二進(jìn)制日志

主要記錄對(duì)MySQL數(shù)據(jù)庫執(zhí)行的插入、修改和刪除操作,并且也會(huì)記錄SQL語句執(zhí)行的時(shí)間、執(zhí)行的時(shí)長,但是二進(jìn)制日志不記錄select、show等不修改數(shù)據(jù)庫的SQL。主要用于恢復(fù)數(shù)據(jù)庫的數(shù)據(jù)和實(shí)現(xiàn)MySQL主從復(fù)制。

查看二進(jìn)制日志是否開啟。

showvariableslike'%log_bin%';

查看二進(jìn)制日志的參數(shù)。

showvariableslike'%binlog%'

查看日志文件。

showbinarylogs;

慢查詢?nèi)罩?/p>

慢查詢主要記錄的是執(zhí)行時(shí)間超過指定時(shí)間的SQL語句,這個(gè)時(shí)間默認(rèn)是10秒。

查看是否開啟慢查詢?nèi)罩尽?/p>

showvariableslike'%slow_query%';

查看慢查詢?cè)O(shè)置的時(shí)長。

showvariableslike'%long_query_time%'

數(shù)據(jù)文件

數(shù)據(jù)文件中主要包括了:db.opt文件、frm文件、MYD文件、MYI文件、ibd文件、ibdata文件、ibdata1文件、ib_logfile0和ib_logfile1文件等。

db.opt文件

主要記錄當(dāng)前數(shù)據(jù)庫使用的字符集和檢驗(yàn)規(guī)則等信息。

frm文件

存儲(chǔ)數(shù)據(jù)表的結(jié)構(gòu)信息,主要是數(shù)據(jù)表相關(guān)的元數(shù)據(jù)信息,包括數(shù)據(jù)表的表結(jié)構(gòu)定義信息,每張表都會(huì)有一個(gè)frm文件。

值得注意的是:MySQL8版本中的innodb存儲(chǔ)引擎的表沒有frm文件。(后面專門寫一些MySQL8新特性的文章,從使用到底層原理與MySQL5到底有何不同)。

MYD文件

MyISAM存儲(chǔ)引擎專用的文件格式,主要存放MyISAM存儲(chǔ)引擎數(shù)據(jù)表中的數(shù)據(jù),每張MyISAM存儲(chǔ)引擎表對(duì)應(yīng)一個(gè).MYD文件。

MYI文件

MyISAM存儲(chǔ)引擎專用的文件格式,主要存放與MyISAM存儲(chǔ)引擎數(shù)據(jù)表相關(guān)的索引信息,每張MyISAM存儲(chǔ)引擎表對(duì)應(yīng)一個(gè).MYI文件。

ibd文件

存放Innodb存儲(chǔ)引擎的數(shù)據(jù)文件和索引文件,主要存放的是獨(dú)享表空間的數(shù)據(jù)和索引,每張表對(duì)應(yīng)一個(gè).ibd文件。

ibdata文件

存放Innodb存儲(chǔ)引擎的數(shù)據(jù)文件和索引文件,主要存放的是共享表空間的數(shù)據(jù)和索引,所有表共用一個(gè)(或者多個(gè)).ibdata文件,可以根據(jù)配置來指定共用的.ibdata文件個(gè)數(shù)。

ibdata1文件

MySQL的系統(tǒng)表空間數(shù)據(jù)文件,主要存儲(chǔ)MySQL的數(shù)據(jù)表元數(shù)據(jù)、Undo日志等信息。

ib_logfile0和ib_logfile1文件

MySQL數(shù)據(jù)庫中的Redo log文件,主要用于MySQL實(shí)現(xiàn)事務(wù)的持久性。如果在某個(gè)時(shí)間點(diǎn)MySQL發(fā)生了故障,此時(shí)如果有臟頁沒有寫入到數(shù)據(jù)庫的ibd文件中,在重啟MySQL的時(shí)候,MySQL會(huì)根據(jù)Redo Log信息進(jìn)行重做,將寫入Redo Log并且尚未寫入數(shù)據(jù)表的數(shù)據(jù)進(jìn)行持久化操作。

配置文件

用于存放MySQL所有的配置信息,在Unix/Linux環(huán)境中是my.cnf文件,在Windows環(huán)境中是my.ini文件。

pid文件

pid文件是存放MySQL進(jìn)程運(yùn)行時(shí)的進(jìn)程號(hào)的文件,主要存在于Unix/Linux環(huán)境中,具體的存儲(chǔ)目錄可以在my.cnf或者my.ini文件中進(jìn)行配置。

socket文件

socket文件和pid文件一樣,都是MySQL在Unix/Linux環(huán)境中運(yùn)行才會(huì)有的文件。在Unix/Linux環(huán)境中,客戶端可以直接通過socket來連接MySQL。

原文標(biāo)題:一文搞懂MySQL體系架構(gòu)!

文章出處:【微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6811

    瀏覽量

    88743
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    797

    瀏覽量

    26399

原文標(biāo)題:一文搞懂MySQL體系架構(gòu)!

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MySQL知識(shí)點(diǎn)匯總

    大家好,這部分被稱為DQL部分,是每個(gè)學(xué)習(xí)MySQL必須要學(xué)會(huì)的部分,下面就讓我來介紹MySQL中的其他部分。
    的頭像 發(fā)表于 08-05 15:27 ?352次閱讀
    <b class='flag-5'>MySQL</b>知識(shí)點(diǎn)匯總

    MySQL的整體邏輯架構(gòu)

    支持多種存儲(chǔ)引擎是眾所周知的MySQL特性,也是MySQL架構(gòu)的關(guān)鍵優(yōu)勢之一。如果能夠理解MySQL Server與存儲(chǔ)引擎之間是怎樣通過API交互的,將大大有利于理解MySQL的核心
    的頭像 發(fā)表于 04-30 11:14 ?414次閱讀
    <b class='flag-5'>MySQL</b>的整體邏輯架構(gòu)

    阿里二面:了解MySQL事務(wù)底層原理嗎

    MySQL 是如何來解決臟寫這種問題的?沒錯(cuò),就是鎖。MySQL 在開啟一個(gè)事務(wù)的時(shí)候,他會(huì)將某條記錄和事務(wù)做一個(gè)綁定。這個(gè)其實(shí)和 JVM 鎖是類似的。
    的頭像 發(fā)表于 01-18 16:34 ?307次閱讀
    阿里二面:了解<b class='flag-5'>MySQL</b>事務(wù)<b class='flag-5'>底層</b>原理嗎

    MySQL密碼忘記了怎么辦?MySQL密碼快速重置方法步驟命令示例!

    MySQL密碼忘記了怎么辦?MySQL密碼快速重置方法步驟命令示例! MySQL是一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),如果你忘記了MySQL的密碼,不必?fù)?dān)心,可以通過一些簡單的步驟來快速重
    的頭像 發(fā)表于 01-12 16:06 ?705次閱讀

    如何使用Golang連接MySQL

    首先我們來看如何使用Golang連接MySQL
    的頭像 發(fā)表于 01-08 09:42 ?3201次閱讀
    如何使用Golang連接<b class='flag-5'>MySQL</b>

    mysql密碼忘了怎么重置

    mysql密碼忘了怎么重置? MySQL是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),密碼用于保護(hù)數(shù)據(jù)庫的安全性和保密性。如果你忘記了MySQL的密碼,可以通過以下幾種方法進(jìn)行重置。 方法一:使用MySQ
    的頭像 發(fā)表于 12-27 16:51 ?5989次閱讀

    GitHub底層數(shù)據(jù)庫無縫升級(jí)到MySQL 8.0的經(jīng)驗(yàn)

    GitHub 團(tuán)隊(duì)近日分享了他們將 GitHub.com 的底層數(shù)據(jù)庫無縫升級(jí)到 MySQL 8.0 的經(jīng)驗(yàn)。 據(jù)介紹,GitHub 使用 MySQL 來存儲(chǔ)大量關(guān)系數(shù)據(jù),因此在不影響網(wǎng)站服務(wù)級(jí)別
    的頭像 發(fā)表于 12-13 10:21 ?475次閱讀
    GitHub<b class='flag-5'>底層</b>數(shù)據(jù)庫無縫升級(jí)到<b class='flag-5'>MySQL</b> 8.0的經(jīng)驗(yàn)

    mysql數(shù)據(jù)庫基礎(chǔ)命令

    MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),經(jīng)常用于存儲(chǔ)、管理和操作數(shù)據(jù)。在本文中,我們將詳細(xì)介紹MySQL的基礎(chǔ)命令,并提供與每個(gè)命令相關(guān)的詳細(xì)解釋。 登錄MySQL 要登錄MySQL
    的頭像 發(fā)表于 12-06 10:56 ?530次閱讀

    php的mysql無法啟動(dòng)

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),而PHP是一種廣泛應(yīng)用于服務(wù)器端的腳本語言。在使用PHP開發(fā)網(wǎng)站或應(yīng)用時(shí),經(jīng)常會(huì)碰到MySQL無法啟動(dòng)的問題。本文將詳細(xì)介紹解決MySQL無法啟動(dòng)的方法
    的頭像 發(fā)表于 12-04 15:59 ?1359次閱讀

    docker部署mysql的壞處

    Docker 是一種虛擬化技術(shù),它允許開發(fā)人員在容器內(nèi)打包應(yīng)用程序及其所有依賴項(xiàng),從而實(shí)現(xiàn)在不同環(huán)境中運(yùn)行相同的應(yīng)用程序的能力。然而,在使用 Docker 部署 MySQL 時(shí),也存在一些潛在
    的頭像 發(fā)表于 11-23 09:29 ?1328次閱讀

    mysql和sql server區(qū)別

    MySQL和SQL Server是兩種常見的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),用于存儲(chǔ)和管理數(shù)據(jù)庫。雖然它們都支持SQL語言,但在其他方面存在一些顯著的區(qū)別。以下是MySQL和SQL Server
    的頭像 發(fā)表于 11-21 11:07 ?1451次閱讀

    MySQL導(dǎo)出的步驟

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),用于存儲(chǔ)和管理大量的結(jié)構(gòu)化數(shù)據(jù)。在實(shí)際應(yīng)用中,我們經(jīng)常需要將MySQL數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到其他地方,如備份數(shù)據(jù)、數(shù)據(jù)遷移、數(shù)據(jù)分析等。下面是使用MySQL
    的頭像 發(fā)表于 11-21 10:58 ?739次閱讀

    mysql主從復(fù)制 混合類型的復(fù)制

    MySQL主從復(fù)制是一種常用的數(shù)據(jù)復(fù)制技術(shù),可以實(shí)現(xiàn)數(shù)據(jù)從一個(gè)MySQL服務(wù)器(主服務(wù)器)復(fù)制到另一個(gè)MySQL服務(wù)器(從服務(wù)器)。在主從復(fù)制中,混合類型的復(fù)制是一種較為靈活的復(fù)制模式
    的頭像 發(fā)表于 11-16 14:20 ?517次閱讀

    mysql主從復(fù)制的原理

    MySQL主從復(fù)制是一種數(shù)據(jù)庫復(fù)制技術(shù),它允許將一個(gè)MySQL數(shù)據(jù)庫的更新操作自動(dòng)復(fù)制到其他MySQL數(shù)據(jù)庫上的過程。主要通過MySQL的b
    的頭像 發(fā)表于 11-16 14:18 ?454次閱讀

    MYSQL事務(wù)的底層原理詳解

    在事務(wù)的實(shí)現(xiàn)機(jī)制上,MySQL 采用的是 WAL:Write-ahead logging,預(yù)寫式日志,機(jī)制來實(shí)現(xiàn)的。
    的頭像 發(fā)表于 11-15 10:10 ?538次閱讀
    <b class='flag-5'>MYSQL</b>事務(wù)的<b class='flag-5'>底層</b>原理詳解