高质量解读《高性能mysql》——第1章 MySQL架构与历史
前言:
高效讀書(shū),一張邏輯圖帶你讀懂、讀薄書(shū)中重點(diǎn)。
深入學(xué)習(xí)MySQL系列,解讀的目的是為了把書(shū)讀薄,抽出重點(diǎn)進(jìn)行梳理、理解、運(yùn)用。因大量文字很容易讓人覺(jué)得枯燥無(wú)味,為此博主花費(fèi)一定精力和時(shí)間整理輸出為邏輯思維圖,以便大家學(xué)習(xí)和參考。
--------------------------------------------------------------------------------------
注:下面文字只是對(duì)邏輯思維圖的”翻譯“,節(jié)省時(shí)間,只看圖即可。
目錄
MySQL架構(gòu)與歷史邏輯思維圖
MySQL邏輯架構(gòu)
連接管理與安全性
優(yōu)化與執(zhí)行
并發(fā)控制
讀寫(xiě)鎖
鎖粒度
鎖策略
事務(wù)
特性
隔離級(jí)別
死鎖
事務(wù)日志
MySQL中的事務(wù)
多版本并發(fā)控制
MySQL存儲(chǔ)引擎
InnoDB 存儲(chǔ)引擎
MyISAM 存儲(chǔ)引擎
MySQL 內(nèi)建的其他存儲(chǔ)引擎
第三方存儲(chǔ)引擎
選擇合適的引擎
轉(zhuǎn)換表的引擎
MySQL時(shí)間線
MySQL開(kāi)發(fā)模式
總結(jié)
MySQL架構(gòu)與歷史邏輯思維圖
MySQL架構(gòu)與歷史?
MySQL邏輯架構(gòu)
三層架構(gòu)
第一層 連接/線程處理
連接處理、授權(quán)認(rèn)證、安全認(rèn)證等
第二層 MySQL核心服務(wù)
查詢(xún)解析、分析、優(yōu)化、緩存以及所有內(nèi)置函數(shù)等
所有跨存儲(chǔ)引擎的功能:存儲(chǔ)過(guò)程、觸發(fā)器、視圖等
第三層 存儲(chǔ)引擎
負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)和提取
服務(wù)器通過(guò)API與存儲(chǔ)引擎進(jìn)行通信,API屏蔽了不同存儲(chǔ)引擎之間的差異
存儲(chǔ)引擎不會(huì)去解析SQL,不同存儲(chǔ)引擎之間也不會(huì)相互通信
連接管理與安全性
每個(gè)客戶(hù)端連接對(duì)應(yīng)一個(gè)線程。服務(wù)器會(huì)負(fù)責(zé)緩存,不需要每一個(gè)新建的連接創(chuàng)建或者銷(xiāo)毀線程
認(rèn)證基于用戶(hù)名、原始主機(jī)信息和密碼
優(yōu)化與執(zhí)行
解析查詢(xún),創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)(解析樹(shù))。用戶(hù)可以請(qǐng)求優(yōu)化解釋(explain)優(yōu)化過(guò)程的各個(gè)因素
優(yōu)化器并不關(guān)心使用的是什么存儲(chǔ)引擎,但是存儲(chǔ)引擎對(duì)于優(yōu)化查詢(xún)有影響
在解析查詢(xún)SQL之前,服務(wù)器會(huì)優(yōu)先檢查查詢(xún)緩存(Query Cache)
并發(fā)控制
多個(gè)查詢(xún)?nèi)绻谕粫r(shí)刻修改數(shù)據(jù),都會(huì)產(chǎn)生并發(fā)控制的問(wèn)題
讀寫(xiě)鎖
讀鎖是共享的,或者說(shuō)是相互不阻塞的
寫(xiě)鎖是排他的,也就是說(shuō)一個(gè)寫(xiě)鎖會(huì)阻塞其他的寫(xiě)鎖和讀鎖
目的:確保在給定的時(shí)間里,只有一個(gè)用戶(hù)能執(zhí)行寫(xiě)入,并防止其他用戶(hù)讀取正在寫(xiě)入的同一資源
鎖粒度
目的:提高共享資源并發(fā)性的方式,讓鎖定的對(duì)象更有選擇性
只鎖定需要修改的部分?jǐn)?shù)據(jù),而不是全部資源
只會(huì)對(duì)修改的數(shù)據(jù)片進(jìn)行精確的鎖定
鎖策略
就是在鎖的開(kāi)銷(xiāo)和數(shù)據(jù)的安全性之間尋求平衡
表鎖(talbe lock)
MySQL中最基本的鎖策略,并且是開(kāi)銷(xiāo)最小的策略
行級(jí)鎖(row lock)
可以最大程度地支持并發(fā)處理(同時(shí)也帶來(lái)了最大的鎖開(kāi)銷(xiāo))
事務(wù)
概念:事務(wù)就是一組原子性的SQL查詢(xún),或者說(shuō)是一個(gè)獨(dú)立的工作單元
特性
原子性(atomicity)
原子的概念就是不可分割,你可以把它理解為組成物質(zhì)的基本單位,也是我們進(jìn)行數(shù)據(jù)處理操作的基本單位。
一致性(consistency)
一致性指的就是數(shù)據(jù)庫(kù)在進(jìn)行事務(wù)操作后,會(huì)由原來(lái)的一致?tīng)顟B(tài),變成另一種一致的狀態(tài)。也就是說(shuō)當(dāng)事務(wù)提交后,或者當(dāng)事務(wù)發(fā)生回滾后,數(shù)據(jù)庫(kù)的完整性約束不能被破壞。
隔離性(isolation)
它指的是每個(gè)事務(wù)都是彼此獨(dú)立的,不會(huì)受到其他事務(wù)的執(zhí)行影響。也就是說(shuō)一個(gè)事務(wù)在提交之前,對(duì)其他事務(wù)都是不可見(jiàn)的。
持久性(durability)
事務(wù)提交之后對(duì)數(shù)據(jù)的修改是持久性的,即使在系統(tǒng)出故障的情況下,比如系統(tǒng)崩潰或者存儲(chǔ)介質(zhì)發(fā)生故障,數(shù)據(jù)的修改依然是有效的。因?yàn)楫?dāng)事務(wù)完成,數(shù)據(jù)庫(kù)的日志就會(huì)被更新,這時(shí)可以通過(guò)日志,讓系統(tǒng)恢復(fù)到最后一次成功的更新?tīng)顟B(tài)。
事務(wù)的四大特性概括
在這四個(gè)特性中,原子性是基礎(chǔ),隔離性是手段,一致性是約束條件,而持久性是我們的目的
隔離級(jí)別
READ UNCOMMITTED(未提交讀)
事務(wù)中的修改,即使沒(méi)提交,對(duì)其他事務(wù)也都是可見(jiàn)的
事務(wù)可以讀取未提交的數(shù)據(jù),稱(chēng)為:臟讀(Dirty Read)
實(shí)際應(yīng)用中一般很少使用
READ COMMITTED(提交讀)
大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)級(jí)別都是READ COMMITTED(MySQL不是)
一個(gè)事務(wù)開(kāi)始時(shí),只能“看見(jiàn)”已經(jīng)提交的事務(wù)所做的修改
這個(gè)級(jí)別有時(shí)候也叫做:不可重復(fù)讀(nonrepeatableread),因?yàn)閮纱螆?zhí)行同樣的查詢(xún),可能會(huì)得到不一樣的結(jié)果
REPEATABLE READ(可重復(fù)讀)
該級(jí)別保證了在同一個(gè)事務(wù)中多次讀取同樣的記錄的結(jié)果是一致的
無(wú)法解決幻讀(Phantom Read)的問(wèn)題,幻讀:指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí),會(huì)產(chǎn)生幻行(Phantom Row)
可重復(fù)讀是MySQL的默認(rèn)事務(wù)隔離級(jí)別
SERIALIZABLE(可串行化)
最高的隔離級(jí)別
通過(guò)強(qiáng)制事務(wù)串行執(zhí)行,避免了幻讀的問(wèn)題
實(shí)際應(yīng)用中很少用,只有當(dāng)非常確保數(shù)據(jù)的一致性且可以接受沒(méi)有并發(fā)的情況下,才考慮采用該級(jí)別
死鎖
概念:指兩個(gè)或者多個(gè)事務(wù)在同一資源上相互占用,并請(qǐng)求鎖定對(duì)方占用的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象
可能產(chǎn)生情況
當(dāng)多個(gè)事務(wù)試圖以不同的順序鎖定資源時(shí)
當(dāng)多個(gè)事務(wù)同時(shí)鎖定同一個(gè)資源時(shí)(當(dāng)兩個(gè)事務(wù)都等待對(duì)方釋放鎖,同時(shí)又持有對(duì)方需要的鎖)
如何解決
死鎖檢測(cè)。檢測(cè)到死鎖的循環(huán)依賴(lài),并立即返回一個(gè)錯(cuò)誤
死鎖超時(shí)機(jī)制。當(dāng)查詢(xún)的時(shí)間達(dá)到鎖等待超時(shí)的設(shè)定后放棄鎖請(qǐng)求
大多數(shù)情況下,只需要重新執(zhí)行因死鎖回滾的事務(wù)即可
事務(wù)日志
目的:提高事務(wù)效率
使用事務(wù)日志,只需修改其內(nèi)存,再把修改行為記錄到硬盤(pán)的事務(wù)日志中
事務(wù)日志持久化以后,內(nèi)存中被修改的數(shù)據(jù)在后臺(tái)再慢慢地刷回到磁盤(pán)
MySQL中的事務(wù)
MySQL 兩種事務(wù)型的存儲(chǔ)引擎:InnoDB和NDB Cluster
自動(dòng)提交(AUTOCOMMIT)
MySQL默認(rèn)采用自動(dòng)提交(AUTOCOMMIT)模式。意思就是每個(gè)查詢(xún)都被當(dāng)做一個(gè)事務(wù)提交操作
在事務(wù)中混合使用存儲(chǔ)引擎
隱式和顯式鎖定
多版本并發(fā)控制
可以認(rèn)為MVCC是行級(jí)鎖的一個(gè)變種,但是它在很多情況下避免了加鎖操作,因此開(kāi)銷(xiāo)更低
MVCC的實(shí)現(xiàn),是通過(guò)保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)的
InnoDB的MVCC,是通過(guò)在每行記錄后面保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn)的
MVCC 只在REPEATABLE READ(可重復(fù)讀)和READ COMMITTED(提交讀)兩個(gè)隔離級(jí)別下工作。其他兩個(gè)隔離級(jí)別都和MVCC不兼容
MySQL存儲(chǔ)引擎
InnoDB 存儲(chǔ)引擎
InnoDB是MySQL的默認(rèn)事務(wù)型引擎,也是最重要、使用最廣泛的存儲(chǔ)引擎
它被設(shè)計(jì)用來(lái)處理大量的短期(short-lived)事務(wù),短期事務(wù)大部分情況是正常提交的,很少會(huì)被回滾
InnoDB的性能和自動(dòng)崩潰恢復(fù)特性,使得它在非事務(wù)型存儲(chǔ)的需求中也很流行
概覽
InnoDB的數(shù)據(jù)存儲(chǔ)在表空間(tablespace)中,表空間是由InnoDB管理的一個(gè)黑盒子,由一系列的數(shù)據(jù)文件組成
InnoDB 采用MVCC來(lái)支持高并發(fā),并且實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的隔離級(jí)別
InnoDB表是基于聚簇索引建立的
InnoDB內(nèi)部做了很多優(yōu)化,包括從磁盤(pán)讀取數(shù)據(jù)時(shí)采用的可預(yù)測(cè)性預(yù)讀,能夠自動(dòng)在內(nèi)存中創(chuàng)建hash索引加速讀操作,以及能夠加速插入操作的插入緩沖區(qū)等
InnoDB的行為是非常復(fù)雜的
InnoDB通過(guò)一些機(jī)制和工具支持真正的熱備份
MyISAM 存儲(chǔ)引擎
相關(guān)描述
在MySQL 5.1及之前的版本,MyISAM是默認(rèn)的存儲(chǔ)引擎
MyISAM提供了大量的特性,包含全文索引、壓縮、空間函數(shù)等
MyISAM不支持事務(wù)和行級(jí)鎖,且崩潰后無(wú)法安全恢復(fù)
存儲(chǔ)
MyISAM會(huì)將表存儲(chǔ)在兩個(gè)文件中:數(shù)據(jù)文件和索引文件,分別以.MYD和.MYI為擴(kuò)展名
MyISAM表如果是變長(zhǎng)行,則默認(rèn)配置只能處理256TB的數(shù)據(jù)
特性
加鎖與并發(fā)
MyISAM對(duì)整張表加鎖,而不是針對(duì)行
修復(fù)
MySQL可以手動(dòng)或者自動(dòng)執(zhí)行檢查和修復(fù)操作
索引特性
即使是BLOB和TEXT等長(zhǎng)字段,也可以基于前500個(gè)字符創(chuàng)建索引;也支持全文索引
延遲更新索引鍵(Delayed Key Write)
壓縮表
壓縮表不能進(jìn)行修改;可以極大地減少磁盤(pán)空間占用和磁盤(pán)I/O
壓縮時(shí)表中的記錄是獨(dú)立壓縮的,所以讀取單行時(shí)不需要去解壓整個(gè)表
性能
設(shè)計(jì)簡(jiǎn)單,數(shù)據(jù)以緊密格式存儲(chǔ),所以某些場(chǎng)景下性能很好
MySQL 內(nèi)建的其他存儲(chǔ)引擎
Archive 引擎
只支持INSERT和SELECT操作,在MySQL5.1前不支持索引
會(huì)緩存所有的寫(xiě)并利用zlib對(duì)插入的行進(jìn)行壓縮,所以比MyISAM表的磁盤(pán)I/O更少
支持行級(jí)鎖和專(zhuān)用的緩存區(qū),可以實(shí)現(xiàn)高并發(fā)插入
適用場(chǎng)景
日志或者數(shù)據(jù)采集
需要更快速的INSERT操作的場(chǎng)景
Blackhole 引擎
沒(méi)有實(shí)現(xiàn)任何存儲(chǔ)機(jī)制
可以用于復(fù)制數(shù)據(jù)到備庫(kù),或者簡(jiǎn)單地記錄到日志
CSV 引擎
可以將普通的CSV文件(逗號(hào)分割)作為MySQL表來(lái)處理,但是不支持索引
Federated 引擎
是訪問(wèn)其他MySQL服務(wù)器的一個(gè)代理
Memory 引擎
快速訪問(wèn)數(shù)據(jù),且數(shù)據(jù)不會(huì)被修改,重啟后丟失也沒(méi)關(guān)系的情景
比MyISAM表要快一個(gè)數(shù)量級(jí)
重啟后,結(jié)構(gòu)還會(huì)保留,數(shù)據(jù)會(huì)丟失
適用場(chǎng)景
用于查找或者映射表,比如講郵編和地市名映射的表
用戶(hù)緩存數(shù)據(jù)
用戶(hù)保存數(shù)據(jù)分析中產(chǎn)生的中間數(shù)據(jù)
Merge 引擎
是MyISAM引擎的一個(gè)變種,由多個(gè)MyISAM表合并而來(lái)的虛擬表
NDB 集群引擎
作為SQL和NDB原生協(xié)議之間的接口
第三方存儲(chǔ)引擎
OLTP 類(lèi)引擎
是基于InnoDB引擎的一個(gè)改進(jìn)版本。改進(jìn)點(diǎn)主要集中在性能、可測(cè)量性和操作靈活性方面
面向列的存儲(chǔ)引擎
MySQL默認(rèn)是面向行的,每一行的數(shù)據(jù)都是一起存儲(chǔ)的,服務(wù)器的查詢(xún)也是以行為單位處理的
面向列的存儲(chǔ)方式,在大數(shù)據(jù)量處理時(shí),可能效率更高,傳輸更少的數(shù)據(jù),每一列的單獨(dú)存儲(chǔ),壓縮效率也會(huì)更高
社區(qū)存儲(chǔ)引擎
Aria、Groonga、OQGraph等
選擇合適的引擎
除非需要用到某些InnoDB不具備的特性,并且沒(méi)有其他辦法可以替代,否則都應(yīng)該優(yōu)先選擇InnoDB引擎
如果應(yīng)用需要不同的存儲(chǔ)引擎,考慮因素如下
事務(wù)
備份
崩潰恢復(fù)
特有的特性
常見(jiàn)應(yīng)用場(chǎng)景
日志型應(yīng)用
實(shí)時(shí)記錄請(qǐng)求日志
插入速度快,MyISAM或者Archive存儲(chǔ)引擎比較合適,開(kāi)銷(xiāo)低,且插入速度快
對(duì)記錄的日志做分析報(bào)表
利用MySQL內(nèi)置的復(fù)制方案將數(shù)據(jù)復(fù)制一份到備庫(kù)
備庫(kù)上執(zhí)行耗時(shí)間和CPU的查詢(xún),主庫(kù)用于高效的插入操作,互不影響
只讀或者大部分情況下只讀的表
建議采用InnoDB
訂單處理
InnoDB是訂單處理類(lèi)應(yīng)用的最佳選擇
電子公告牌和主題討論論壇
CD-ROM應(yīng)用
可以考慮MyIsam表或者M(jìn)yIsam壓縮表
大數(shù)據(jù)量
數(shù)據(jù)倉(cāng)庫(kù)
轉(zhuǎn)換表的引擎
ALTER TABLE
ALTER TABLE mytable ENGINE=InnoDB;
導(dǎo)出與導(dǎo)入
mysqldump導(dǎo)出文件,修改文件中CREATE TABLE語(yǔ)句的存儲(chǔ)引擎選項(xiàng)
創(chuàng)建與查詢(xún)(CREATE和SELECT)
MySQL時(shí)間線
對(duì)于懷舊者,自行搜索
MySQL開(kāi)發(fā)模式
遵循GPL開(kāi)源協(xié)議
總結(jié)
擁有分層的架構(gòu)
最初基于ISAM構(gòu)建(后被MyISAM取代),后續(xù)添加了更多的存儲(chǔ)引擎和事務(wù)支持
存儲(chǔ)引擎 API 的架構(gòu)的缺點(diǎn)。除了InnoDB引擎外的存儲(chǔ)引擎,選擇可能讓事情變得更加復(fù)雜
MySQL基于GPL協(xié)議開(kāi)放全部源代碼,社區(qū)和客戶(hù)都可以獲得堅(jiān)固而穩(wěn)定的數(shù)據(jù)庫(kù),變得更加可擴(kuò)展和有價(jià)值
以上內(nèi)容均為博主原創(chuàng)手碼梳理。碼字不易,但只要能提高,都是值得的。如果您覺(jué)得,這篇文章對(duì)您的基礎(chǔ)知識(shí)學(xué)習(xí)、鞏固、提高有幫助,歡迎點(diǎn)贊、分享、收藏,謝謝。 --天天water
總結(jié)
以上是生活随笔為你收集整理的高质量解读《高性能mysql》——第1章 MySQL架构与历史的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java面试题40 当编译并运行下面程序
- 下一篇: shiro学习(7):shiro连接数据