三層邏輯架構(gòu)
- 第一層是連接/線程處理嚼贡。比如連接處理同诫、授權(quán)認(rèn)證、安全等等误窖。
- 第二層是核心服務(wù)層。包括查詢解析柔吼、分析吭服、優(yōu)化蝗罗、緩存以及所有內(nèi)置函數(shù),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn):存儲(chǔ)過程串塑、觸發(fā)器、視圖等等打瘪。
- 第三層包含了存儲(chǔ)引擎傻昙。存儲(chǔ)引擎負(fù)責(zé) MySQL 中的數(shù)據(jù)的存儲(chǔ)與提取。每個(gè)存儲(chǔ)引擎都有它的優(yōu)勢和劣勢妆档。服務(wù)器通過API與存儲(chǔ)引擎進(jìn)行通信。
并發(fā)控制
只要有多個(gè)查詢需要在同一時(shí)刻修改數(shù)據(jù)胸梆,就會(huì)產(chǎn)生并發(fā)控制的問題。MySQL 在兩個(gè)層面控制并發(fā)讀寫:服務(wù)器層與存儲(chǔ)引擎層碰镜。
讀鎖:共享、互不阻塞秽荤。
寫鎖:排他性菠发。會(huì)阻塞其他寫鎖與讀鎖。
表級鎖:鎖粒度較大滓鸠,但是鎖的開銷最小。
行級鎖:只在存儲(chǔ)引擎層實(shí)現(xiàn)糜俗。如 InnoDB。
事務(wù)
通俗地講珠月,事務(wù)就是一組 SQL 要么全部執(zhí)行成功楔敌,要么全部失敗回滾。
事務(wù)的ACID概念:
- 原子性(atomicity):一個(gè)事務(wù)是一個(gè)不可分割的最小工作單元卵凑,整個(gè)事務(wù)的所有操作要么全部執(zhí)行成功,要么全部失敗回滾伙判。
- 一致性(consistency):事務(wù)總是從一個(gè)一致性狀態(tài)轉(zhuǎn)移到另一個(gè)一致性狀態(tài)黑忱。
- 隔離性(isolation):通常來說,一個(gè)事務(wù)所做的修改在最終提交之前甫煞,對其他事務(wù)是不可見的⊙蛲蓿可通過設(shè)置事務(wù)的隔離級別來改變這種情況埃跷。
- 持久性(durability):一旦事務(wù)被提交邮利,其所做的修改就會(huì)永久保存到數(shù)據(jù)庫中垃帅。
事務(wù)的隔離級別
- READ UNCOMMITED(未提交讀):一個(gè)事務(wù)所做的修改,即使沒有提交贸诚,對其他事務(wù)也是可見的。會(huì)產(chǎn)生臟讀(Dirty Read)械念。
- READ COMMITED(提交讀):一個(gè)事務(wù)從開始到提交之前运悲,所做的任何修改對其他事務(wù)都是不可見的。會(huì)產(chǎn)生不可重復(fù)讀班眯。(nonrepeatable read)。
- REPEATABLE READ(可重復(fù)讀):解決了臟讀和不可重復(fù)讀的問題宠能,但是理論上還是無法解決幻讀磁餐。幻讀就是指某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí)诊霹,另一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄,當(dāng)之前的事務(wù)再次讀取該范圍內(nèi)的記錄時(shí)肴楷,會(huì)產(chǎn)生幻行荠呐。InnoDB通過多版本并發(fā)控制解決了幻讀的問題砂客。可重復(fù)讀是MySQL默認(rèn)的隔離級別鞠值。
- SERIALIZABLE(可串行化):強(qiáng)制事務(wù)串行執(zhí)行,避免了幻讀的問題钞钙。會(huì)在讀取的每一行上加鎖,可能導(dǎo)致大量的超時(shí)和鎖爭用的問題芒炼。并發(fā)能力很低。
死鎖
兩個(gè)或多個(gè)事務(wù)在同一資源上相互占用鲸湃,并請求鎖定對方占用的資源子寓,從而導(dǎo)致惡性循環(huán)的現(xiàn)象。當(dāng)多個(gè)事務(wù)試圖以不同的順序鎖定資源時(shí)斜友,就可能會(huì)產(chǎn)生死鎖。為了解決死鎖晒衩,數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)了各種死鎖檢測和死鎖超時(shí)機(jī)制墙歪。InnoDB 目前的處理方法是,將持有最少行級排他鎖的事務(wù)進(jìn)行回滾虹菲。
事務(wù)日志
使用事務(wù)日志,存儲(chǔ)引擎在修改表的數(shù)據(jù)時(shí)只需要修改其內(nèi)存拷貝浪漠,再把該修改行為記錄持久在硬盤上的事務(wù)日志中霎褐,而不用每次都將修改的數(shù)據(jù)本身持久到磁盤。
MySQL中的事務(wù)
MySQL提供了兩種事務(wù)型存儲(chǔ)引擎:InnoDB 和 NDB Cluster响谓。
MySQL默認(rèn)采用自動(dòng)提交模式省艳。
- 隱式鎖定:InnoDB 采用兩階段鎖定協(xié)議娘纷。在事務(wù)執(zhí)行過程中跋炕,隨時(shí)都可以執(zhí)行鎖定,鎖只有在執(zhí)行 COMMIT 或 ROLLBACK 的時(shí)候才會(huì)釋放遏插,并且所有的鎖是在同一時(shí)刻釋放。
- 顯示鎖定:InnoDB 支持通過特定的語句進(jìn)行顯式鎖定胳嘲,這些語句不屬于 SQL 規(guī)范胎围。
SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
多版本并發(fā)控制
MVCC 是行級鎖的一個(gè)變種,但是它在很多情況下避免了加鎖操作白魂,因此開銷更低。通過加版本號的方式蕴坪,讓事務(wù)讀到數(shù)據(jù)的快照版本敬锐。
MySQL存儲(chǔ)引擎
InnoDB存儲(chǔ)引擎
- InnoDB 是 MySQL 默認(rèn)的支持事務(wù)的存儲(chǔ)引擎。
- MySQL5.6 支持全文索引台夺。
- InnoDB 表是基于聚簇索引建立的。(數(shù)據(jù)和索引在一個(gè)文件中)聚簇索引對主鍵查詢有很高的性能梳星。不過它的二級索引必須包含主鍵列滚朵,因此主鍵不宜過大。
MyISAM存儲(chǔ)引擎
- 不支持事務(wù)和行級鎖辕近。
- 支持全文索引、壓縮归粉、空間函數(shù)吞杭。