MySQL的基礎(chǔ)架構(gòu)

基礎(chǔ)架構(gòu)

MySQL的基礎(chǔ)架構(gòu)如下圖:

MySQL服務(wù)器邏輯架構(gòu)圖

大體來(lái)說(shuō)沪么,MySQL 可以分為 Server 層和存儲(chǔ)引擎層兩部分硼婿。

大多數(shù)的MySQL服務(wù)功能都在Server層,包括查詢解析禽车、緩存寇漫、分析刊殉、優(yōu)化以及所有內(nèi)置函數(shù),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn)州胳,比如存儲(chǔ)過(guò)程记焊、觸發(fā)器、視圖等栓撞。

而存儲(chǔ)引擎則是負(fù)責(zé)存儲(chǔ)數(shù)據(jù)遍膜,提供讀寫(xiě)接口。有多種存儲(chǔ)引擎瓤湘,例如InnoDB瓢颅、MyISAM等,各有各的優(yōu)勢(shì)和劣勢(shì)岭粤,針對(duì)不同的應(yīng)用場(chǎng)景惜索。最常用的是 InnoDB,在5.5.5版本以后剃浇, InnoDB是默認(rèn)引擎巾兆,也可以在創(chuàng)建表時(shí)使用“engine=存儲(chǔ)引擎”來(lái)指定特定的引擎。

存儲(chǔ)引擎不會(huì)解析SQL虎囚,但是InnoDB除外角塑,它會(huì)解析外鍵定義,因?yàn)镾erver層沒(méi)有實(shí)現(xiàn)該功能淘讥。

連接器

我們?cè)诓樵償?shù)據(jù)之前圃伶,需要先連接 MySQL。我們可以通過(guò)以下命令連接數(shù)據(jù)庫(kù):

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

其中mysql 是客戶端工具蒲列,用來(lái)跟服務(wù)端建立連接窒朋。在完成TCP握手后,連接器開(kāi)始認(rèn)證你的身份蝗岖,認(rèn)證基于用戶名侥猩、密碼和原始主機(jī)信息。如果使用SSL連接抵赢,還可以使用X.509證書(shū)認(rèn)證欺劳。如果用戶名或密碼出錯(cuò),則收到"Access denied for user"的錯(cuò)誤铅鲤,認(rèn)證通過(guò)則連接器到權(quán)限表里面查出你擁有的權(quán)限划提,之后進(jìn)行的查詢都將依賴于此權(quán)限。也就是說(shuō)邢享,一個(gè)用戶成功建立連接后鹏往,即使你用管理員賬號(hào)這個(gè)用戶的權(quán)限做了修改,也不會(huì)影響已經(jīng)存在的連接的權(quán)限骇塘。

如果客戶端太久沒(méi)有動(dòng)作伊履,則連接器會(huì)自動(dòng)將它斷開(kāi)袜漩,這個(gè)時(shí)間是由參數(shù) wait_timeout 控制的,默認(rèn)值是8小時(shí)湾碎,5.7 版本 斷開(kāi)后可以自動(dòng)重連宙攻。

由于建立連接是相對(duì)復(fù)雜的操作,所以我們一般會(huì)使用長(zhǎng)連接介褥,但是 mysql 在執(zhí)行的過(guò)程中臨時(shí)使用的內(nèi)存是管理在連接對(duì)象中的座掘,這些資源會(huì)等到連接斷開(kāi)才釋放。所以如果連接使用的時(shí)間過(guò)長(zhǎng)柔滔,會(huì)導(dǎo)致內(nèi)存占用過(guò)高溢陪。在 MySQL 5.7 版本之后,可以通過(guò)mysql_reset_connection重新初始化連接資源睛廊,該命令會(huì)釋放資源形真,但是不需要重新連接和重新做權(quán)限驗(yàn)證。

但是現(xiàn)在開(kāi)發(fā)者并不需要注意在程序中是使用短連接或是長(zhǎng)連接了超全,而是將連接交由連接池管理咆霜。

查詢緩存

MySQL 拿到一個(gè)查詢請(qǐng)求后,如果查詢緩存是打開(kāi)的會(huì)先到查詢緩存看看嘶朱,之前是不是執(zhí)行過(guò)這條語(yǔ)句蛾坯。之前執(zhí)行過(guò)的語(yǔ)句及其結(jié)果MySQL將其放在一個(gè)引用表中,類似 key-value 對(duì)的形式疏遏。key 是查詢的語(yǔ)句脉课、當(dāng)前要查詢的數(shù)據(jù)庫(kù)、客戶端協(xié)議版本等等财异,value 是查詢的結(jié)果倘零。如果你的查詢能夠直接在這個(gè)緩存中找到 key,那么這個(gè) value 就會(huì)被直接返回給客戶端(返回之前會(huì)驗(yàn)證權(quán)限)戳寸。

如果語(yǔ)句不在查詢緩存中呈驶,就會(huì)繼續(xù)后面的執(zhí)行階段。執(zhí)行完成后庆揩,執(zhí)行結(jié)果會(huì)被存入查詢緩存中俐东。

但是只要對(duì)表進(jìn)行更新跌穗,那么該表相關(guān)的所有查詢緩存就會(huì)被清空订晌。因此,如果更新頻繁的表蚌吸,不建議進(jìn)行查詢緩存锈拨,除非是配置表這類的,會(huì)比較適合使用查詢緩存羹唠。

在使用查詢緩存時(shí)奕枢,需要注意的是 MySQL 中判斷緩存是否命中時(shí)娄昆,并不會(huì)解析、或者格式化缝彬、參數(shù)化查詢語(yǔ)句(實(shí)際上萌焰,在檢查查詢緩存之前, MySQL 只做了一件事情谷浅,就是通過(guò)一個(gè)大小寫(xiě)不敏感的檢查看看 SQL 語(yǔ)句是否是以 SEL 開(kāi)頭的扒俯,以此來(lái)判斷是否是查詢語(yǔ)句),而是直接使用 SQL 語(yǔ)句和客戶端發(fā)送過(guò)來(lái)的其他原始信息與緩存 key 直接匹配一疯,所以 SQL 語(yǔ)句上的任何不同都會(huì)導(dǎo)致緩存的不命中撼玄。不止如此,但查詢語(yǔ)句出現(xiàn)不確定的數(shù)據(jù)(任何用戶定義的函數(shù)墩邀、存儲(chǔ)函數(shù)掌猛、用戶變量、臨時(shí)表眉睹、mysql 庫(kù)中的系統(tǒng)表荔茬、任何包含列級(jí)別權(quán)限的表)時(shí),不會(huì)被緩存竹海,例如:

DATA_SUB(CURRENT_DATE, INTERVAL 1 DAY) -- 不會(huì)被緩存
DATA_SUB('2020-3-22', INTERVAL 1 DAY) -- 會(huì)被緩存

將參數(shù) query_cache_type 設(shè)置成 DEMAND兔院,這樣對(duì)于默認(rèn)的 SQL 語(yǔ)句都不使用查詢緩存。而對(duì)于你確定要使用查詢緩存的語(yǔ)句站削,可以用 SQL_CACHE 顯式指定坊萝,像下面這個(gè)語(yǔ)句一樣:

 select SQL_CACHE * from user;

查詢緩存默認(rèn)是開(kāi)啟的许起,可以關(guān)閉查詢緩存十偶。

- 臨時(shí)的直接命令行執(zhí)行
set global query_cache_size=0
set global query_cache_type=0

- 永久的修改配置文件my.cnf ,添加下面的配置query_cache_type=0
query_cache_size=0

需要注意的是在 MySQL 8.0 版本,查詢緩存的整塊功能已經(jīng)被刪除了园细。

解析器

在執(zhí)行 SQL 前惦积,需要先對(duì) SQL 語(yǔ)句進(jìn)行解析。

解析器先對(duì) SQL 語(yǔ)句做詞法分析猛频,先識(shí)別出哪些是關(guān)鍵字狮崩,代表什么(將輸入轉(zhuǎn)化為一個(gè)個(gè) Token,然后分析哪些 Token 是關(guān)鍵字鹿寻,哪些不是)睦柴。

然后再做語(yǔ)法分析,通過(guò)語(yǔ)法規(guī)則來(lái)驗(yàn)證和解析查詢毡熏,比如 SQL 中是否使用了錯(cuò)誤的關(guān)鍵字或者關(guān)鍵字的順序是否正確坦敌、及符號(hào)是否正確,并生成語(yǔ)法樹(shù)。

預(yù)處理器則會(huì)根據(jù) MySQL 規(guī)則進(jìn)一步檢查語(yǔ)法樹(shù)是否合法狱窘。比如檢查要查詢的數(shù)據(jù)表和數(shù)據(jù)列是否存在杜顺,解析名字和別名是否有歧義等等。

接下來(lái)預(yù)處理器還會(huì)驗(yàn)證權(quán)限(precheck)蘸炸。

如果語(yǔ)句不對(duì)躬络,就會(huì)收到“You have an error in yourSQL syntax”的錯(cuò)誤提醒。一般語(yǔ)法錯(cuò)誤會(huì)提示第一個(gè)出現(xiàn)錯(cuò)誤的位置搭儒,所以你要關(guān)注的是緊接“use near”的內(nèi)容洗鸵。

優(yōu)化器

通過(guò)解析器的解析后,優(yōu)化器就要對(duì)SQL語(yǔ)句進(jìn)行優(yōu)化仗嗦。優(yōu)化器并不關(guān)心表使用的存儲(chǔ)引擎是什么膘滨,但是存儲(chǔ)引擎對(duì)于查詢優(yōu)化是有影響的,因?yàn)閮?yōu)化器會(huì)請(qǐng)求存儲(chǔ)引擎提供容量或是某個(gè)具體操作的開(kāi)銷信息以及表數(shù)據(jù)的統(tǒng)計(jì)信息稀拐,這些都會(huì)影響優(yōu)化器對(duì)查詢語(yǔ)句的優(yōu)化火邓。

優(yōu)化器對(duì)查詢語(yǔ)句的優(yōu)化有,優(yōu)化多表關(guān)聯(lián)的時(shí)候德撬,決定各個(gè)表的連接的順序铲咨;有多個(gè)索引的時(shí)候,決定使用哪個(gè)索引蜓洪;還有重寫(xiě)查詢等等纤勒。

可以使用explain來(lái)查看執(zhí)行計(jì)劃,然后調(diào)整SQL語(yǔ)句隆檀、修改配置等等摇天。

執(zhí)行器

優(yōu)化完 SQL 語(yǔ)句后便開(kāi)始執(zhí)行,先判斷一下是否有該表的查詢權(quán)限恐仑,沒(méi)有則返回沒(méi)有權(quán)限的錯(cuò)誤泉坐。(因?yàn)榭赡苓€有觸發(fā)器這種需要在執(zhí)行器階段才能確定的情況,預(yù)處理器的 precheck 是不能對(duì)這種運(yùn)行時(shí)才涉及到的表進(jìn)行權(quán)限校驗(yàn)的裳仆,所以需要在執(zhí)行時(shí)再進(jìn)行權(quán)限檢查腕让。)

如果有權(quán)限,打開(kāi)表歧斟,然后調(diào)用存儲(chǔ)引擎的接口獲取數(shù)據(jù)返回纯丸。

本文介紹了MySQL的基礎(chǔ)架構(gòu),這也是一條SQL查詢語(yǔ)句執(zhí)行的流程静袖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末觉鼻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勾徽,更是在濱河造成了極大的恐慌滑凉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘帚,死亡現(xiàn)場(chǎng)離奇詭異畅姊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吹由,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)若未,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人倾鲫,你說(shuō)我怎么就攤上這事粗合。” “怎么了乌昔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵隙疚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我磕道,道長(zhǎng)供屉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任溺蕉,我火速辦了婚禮伶丐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疯特。我一直安慰自己哗魂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布漓雅。 她就那樣靜靜地躺著录别,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邻吞。 梳的紋絲不亂的頭發(fā)上庶灿,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音吃衅,去河邊找鬼往踢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徘层,可吹牛的內(nèi)容都是我干的峻呕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼趣效,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘦癌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跷敬,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讯私,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斤寇,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桶癣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娘锁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牙寞。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖莫秆,靈堂內(nèi)的尸體忽然破棺而出间雀,到底是詐尸還是另有隱情,我是刑警寧澤镊屎,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布惹挟,位于F島的核電站,受9級(jí)特大地震影響缝驳,放射性物質(zhì)發(fā)生泄漏匪煌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一党巾、第九天 我趴在偏房一處隱蔽的房頂上張望萎庭。 院中可真熱鬧,春花似錦齿拂、人聲如沸驳规。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吗购。三九已至,卻和暖如春砸狞,著一層夾襖步出監(jiān)牢的瞬間捻勉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工刀森, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踱启,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓研底,卻偏偏與公主長(zhǎng)得像埠偿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榜晦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 7,811評(píng)論 5 116
  • 今天看到一位朋友寫(xiě)的mysql筆記總結(jié)冠蒋,覺(jué)得寫(xiě)的很詳細(xì)很用心,這里轉(zhuǎn)載一下乾胶,供大家參考下抖剿,也希望大家能關(guān)注他原文地...
    信仰與初衷閱讀 4,730評(píng)論 0 30
  • 轉(zhuǎn) # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    呂品?閱讀 9,723評(píng)論 0 44
  • MYSQL應(yīng)該是最流行的WEB后端數(shù)據(jù)庫(kù)朽寞。大量應(yīng)用于PHP,Ruby斩郎,Python脑融,Java 等Web語(yǔ)言開(kāi)發(fā)項(xiàng)目...
    smooth00閱讀 2,294評(píng)論 0 16
  • 一、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲(chǔ)層(數(shù)據(jù)) 構(gòu)建良好的數(shù)據(jù)結(jié)構(gòu)孽拷《终疲可以大大的提升我們S...
    寵辱不驚丶?xì)q月靜好閱讀 2,427評(píng)論 1 8