第一章 MySQL架構(gòu)與歷史(一)(1.7%)

1.1 MySQL邏輯架構(gòu)

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

第一層服務(wù)并非MySQL獨(dú)有,大多數(shù)基于網(wǎng)絡(luò)的客戶端惹盼、服務(wù)端的工具或者服務(wù)都有類似的框架妄辩。

第二層為MySQL的核心服務(wù)功能惑灵,查詢解析、分析眼耀、優(yōu)化英支、緩存以及內(nèi)置函數(shù),并且包括存儲(chǔ)過程哮伟、觸發(fā)器干花、視圖等。

第三層為存儲(chǔ)引擎楞黄,主要負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)和提取池凄。


1.1.1 連接管理與安全性

每個(gè)客戶端連接都會(huì)在服務(wù)器進(jìn)程中擁有一個(gè)線程,這個(gè)連接的查詢只會(huì)在這個(gè)單獨(dú)的線程中執(zhí)行鬼廓,且輪流使用CPU肿仑。服務(wù)器負(fù)責(zé)緩存線程,無需為每個(gè)連接創(chuàng)建或者銷毀線程碎税。

當(dāng)客戶端連接到MySQL服務(wù)器時(shí)尤慰,服務(wù)器會(huì)對(duì)其進(jìn)行驗(yàn)證。如果使用了安全套字節(jié)(SSL)連接方式雷蹂,還可以使用X.509證書認(rèn)證伟端。驗(yàn)證成功后,服務(wù)器會(huì)繼續(xù)驗(yàn)證該客戶端是否具有某個(gè)特定查詢的權(quán)限匪煌。


1.1.2 優(yōu)化與執(zhí)行

MySQL會(huì)解析查詢责蝠,并創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)党巾,并對(duì)其進(jìn)行優(yōu)化,包括重寫查詢霜医、決定表的讀取順序昧港,以及選擇合適的索引等。用戶可以通過關(guān)鍵詞 hint 提示優(yōu)化器支子,影響它的決策過程创肥。也可以請(qǐng)求優(yōu)化器解釋(explain)優(yōu)化過程的各個(gè)因素,提供一個(gè)參考基準(zhǔn)值朋。

優(yōu)化器并不關(guān)心使用的是什么存儲(chǔ)引擎叹侄,但存儲(chǔ)引擎對(duì)于優(yōu)化查詢是有影響的。


1.2 并發(fā)控制

服務(wù)器層與存儲(chǔ)引擎層


1.2.1 讀寫鎖

解決并發(fā)問題的方法就是并發(fā)控制昨登。再處理并發(fā)讀或者寫時(shí)趾代,可以通過實(shí)現(xiàn)一個(gè)由兩種類型的鎖組成的系統(tǒng)來解決問題。兩種類型的鎖通常被稱為供共享鎖(shared lock)排他鎖(exclusive lock)丰辣,也叫讀鎖(read lock) 寫鎖(write lock)撒强。

讀鎖共享的,同一時(shí)刻可以同時(shí)讀取同一個(gè)資源笙什,互不干擾飘哨。

寫鎖排他的,一個(gè)寫鎖會(huì)堵塞其他的寫鎖和讀鎖琐凭。只有這樣芽隆,才能確保在給定時(shí)間里,只有一個(gè)用戶能執(zhí)行寫入统屈,防止其他用戶讀取正在寫入的統(tǒng)一資源胚吁。


1.2.2 鎖粒度

一種提高共享資源并發(fā)性的方式就是讓鎖定對(duì)象更有選擇性,盡量只鎖定需要修改的部分?jǐn)?shù)據(jù)愁憔,而不是所有的資源腕扶。

表鎖(table lock)

表鎖是MySQL中最基本的鎖策略,并且是開銷最小的策略吨掌。

行級(jí)鎖(row lock)

行級(jí)鎖可以最大程度的支持并發(fā)處理半抱,并且?guī)碜畲蟮拈_銷。行級(jí)鎖旨在存儲(chǔ)引擎層實(shí)現(xiàn)思犁。


1.3 事物

事物就是一組原子性的SQL查詢代虾。要不全部執(zhí)行成功进肯,要么全部執(zhí)行失敗激蹲。

一個(gè)運(yùn)行良好的事務(wù)處理系統(tǒng),必須具備ACID特征江掩。

原子性(atomicity)

一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小工作單元学辱,不能只執(zhí)行其中的一部分操作乘瓤。

一致性(consistency)

數(shù)據(jù)庫總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)。

隔離性(isolation)

持久性(durability)


1.3.1 隔離級(jí)別

四個(gè)隔離級(jí)別

1.READ UNCOMMITTED(未提交讀)

事務(wù)中的修改策泣,即使沒提交衙傀,其他事務(wù)也是可見的。事務(wù)可以讀取未提交的數(shù)據(jù)萨咕,這種被稱為臟讀(Dirty Read)统抬。

2.READ COMMITTED(提交讀)

只能看到已提交的事務(wù)所做的修改,其他事務(wù)均不可見危队。

3.REPEATABLE READ(可重復(fù)讀)

保證了同一個(gè)事物中多次讀取同樣的記錄的結(jié)果是一致的聪建。但是無法解決幻讀(Phantom Read)

幻讀,指當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍的內(nèi)容時(shí)茫陆,另外一個(gè)事務(wù)又在該范圍插入了新的紀(jì)錄金麸。

4.SERIALIZABLE(可串行化)

使事務(wù)強(qiáng)制串行,避免幻讀問題簿盅。會(huì)在讀取的每一行數(shù)據(jù)上都加鎖挥下。


1.3.2 死鎖

多個(gè)事務(wù)同時(shí)在同一資源上互相占用,并請(qǐng)求鎖定對(duì)方占用的資源桨醋,從而導(dǎo)致惡性循環(huán)的現(xiàn)象棚瘟。大多數(shù)情況下只需要重新執(zhí)行因死鎖回滾的事務(wù)即可。


1.3.3 事務(wù)日志

事務(wù)日志可以幫助提高事務(wù)的效率喜最。使用事務(wù)日志解取,存儲(chǔ)引擎在修改標(biāo)的數(shù)據(jù)時(shí)只需要修改其內(nèi)存拷貝,再把該修改行行為記錄到持久的硬盤上的事務(wù)日志中返顺,而不是每次都將修改的數(shù)據(jù)本身持久到磁盤禀苦。事務(wù)日志采用的是追加的方式,因此寫日志的操作是磁盤上一小塊區(qū)域內(nèi)的順序I/O遂鹊,因此會(huì)快很多振乏。

如果數(shù)據(jù)的修改已經(jīng)記錄到事務(wù)日志并持久化,但數(shù)據(jù)本身還沒有寫會(huì)磁盤秉扑,此時(shí)系統(tǒng)崩潰慧邮,存儲(chǔ)引擎在重啟時(shí)能夠自動(dòng)回復(fù)這部分修改的數(shù)據(jù)。


1.3.4 MySQL中事務(wù)

提供了兩種事務(wù)型的存儲(chǔ)引擎:InnoDBNDB Cluster

自動(dòng)提交(AUTOCOMMIT)

MySQL默認(rèn)采用自動(dòng)提交模式舟陆,每個(gè)查詢都被當(dāng)作一個(gè)事務(wù)误澳。

可以通過命令查看并且進(jìn)行設(shè)置,1或者ON表示啟動(dòng)秦躯,0或者OFF表示禁用忆谓。

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';

mysql> SET AUTOCOMMIT = 1;


通過命令也可以設(shè)置隔離級(jí)別:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;


在事務(wù)中混合使用存儲(chǔ)引擎

MySQL服務(wù)器不管理事務(wù),事務(wù)是由下層的存儲(chǔ)引擎實(shí)現(xiàn)的踱承。當(dāng)在同一個(gè)事務(wù)中倡缠,使用多種存儲(chǔ)引擎是不可靠的哨免。

當(dāng)事務(wù)回滾時(shí),非事務(wù)型的變更無法撤銷昙沦,會(huì)導(dǎo)致數(shù)據(jù)庫處于不一致的狀態(tài)琢唾,而且難修復(fù)。


隱式和現(xiàn)式鎖定

InnoDB采用的是兩階段鎖定協(xié)議( two-phase locking protocol)盾饮。在事務(wù)執(zhí)行過程中采桃,隨時(shí)都可以執(zhí)行鎖定,鎖只有在執(zhí)行COMMIT或者ROLLBACK的時(shí)候才會(huì)釋放丘损,并且所有的鎖是在同一時(shí)刻被釋放芍碧。


1.4 多版本并發(fā)控制

MySQL的大多數(shù)事務(wù)型存儲(chǔ)引擎實(shí)現(xiàn)的都不是簡(jiǎn)單的行級(jí)鎖『爬基于提升并發(fā)性能的考慮泌豆,它們一般都同時(shí)實(shí)現(xiàn)了多版本并發(fā)控制(MVCC)。

可以認(rèn)為MVCC是行級(jí)鎖的一個(gè)變種吏饿,但是他在很多情況下避免了加鎖操作踪危。因此開銷更低。

InnoDB的MVCC是如何工作的

通過在每行記錄后面保存兩個(gè)隱藏的列來實(shí)現(xiàn)猪落,分別為創(chuàng)建時(shí)間和過期時(shí)間贞远,實(shí)際是系統(tǒng)版本號(hào)。

Select

1.查詢?cè)缬诋?dāng)前事務(wù)版本號(hào)的數(shù)據(jù)行笨忌,這個(gè)可以確保事務(wù)讀取的行蓝仲,要么是在事務(wù)開始前已經(jīng)存在,要么是開始之前未被刪除官疲。

2.行的刪除版本要么未定義袱结,要么大于當(dāng)前事務(wù)版本號(hào)。

Insert

保存當(dāng)前系統(tǒng)版本號(hào)為行版本號(hào)

Delete

保存當(dāng)前系統(tǒng)版本號(hào)為行刪除標(biāo)識(shí)

Update

保存當(dāng)前系統(tǒng)版本號(hào)為行版本號(hào)途凫,同時(shí)修改當(dāng)前系統(tǒng)版本號(hào)為行刪除標(biāo)識(shí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垢夹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子维费,更是在濱河造成了極大的恐慌果元,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犀盟,死亡現(xiàn)場(chǎng)離奇詭異而晒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阅畴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門倡怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事诈胜”希” “怎么了冯事?”我有些...
    開封第一講書人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵焦匈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我昵仅,道長(zhǎng)缓熟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任摔笤,我火速辦了婚禮够滑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吕世。我一直安慰自己彰触,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開白布命辖。 她就那樣靜靜地躺著况毅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尔艇。 梳的紋絲不亂的頭發(fā)上尔许,一...
    開封第一講書人閱讀 49,874評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音终娃,去河邊找鬼味廊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棠耕,可吹牛的內(nèi)容都是我干的余佛。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼窍荧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衙熔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搅荞,我...
    開封第一講書人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤红氯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咕痛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痢甘,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年茉贡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞栅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腔丧,死狀恐怖放椰,靈堂內(nèi)的尸體忽然破棺而出作烟,到底是詐尸還是另有隱情,我是刑警寧澤砾医,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布拿撩,位于F島的核電站,受9級(jí)特大地震影響如蚜,放射性物質(zhì)發(fā)生泄漏压恒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一错邦、第九天 我趴在偏房一處隱蔽的房頂上張望探赫。 院中可真熱鬧,春花似錦撬呢、人聲如沸伦吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毛仪。三九已至,卻和暖如春晨另,著一層夾襖步出監(jiān)牢的瞬間潭千,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工借尿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刨晴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓路翻,卻偏偏與公主長(zhǎng)得像狈癞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茂契,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

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