1.1 MySQL架構(gòu)與歷史
存儲引擎不會去解析SQL寿桨,不同存儲引擎也不會互相通信,InnoDB是個例外,它會解析外鍵定義
1.1.1 連接管理和安全性
? ? ?5.5 開始支持線程池插件
1.1.2 優(yōu)化與執(zhí)行
對于SELECT語句,在解析查詢之前眠菇,服務器會先檢查查詢緩存,如果能夠在其中找到對應的查詢袱衷,服務器就不必再執(zhí)行查詢解析捎废、優(yōu)化和執(zhí)行的整個過程,而是直接返回查詢緩存中的結(jié)果集致燥。
1.2 并發(fā)控制
層面:服務器層與存儲引擎層
1.2.1 讀寫鎖
共享鎖 => 讀鎖? ? 排他鎖 => 寫鎖
1.2.2 鎖粒度
表鎖? 行級鎖(存儲引擎)
1.3 事務
一組原子性的SQL查詢登疗,或者說一個獨立的工作單元
ACID:
原子性(Atomicity)? 一個事務必須被視為一個不可分隔 的最小工作單元,整個事務中的所有操作要么全部提交成功嫌蚤,要么全部失敗回滾
一致性(Consistency)? ? 數(shù)據(jù)庫總是從一個一致性的狀態(tài)轉(zhuǎn)換到另一個一致性的狀態(tài)
隔離性(Isolation)? 一個事務所做的修改在最終提交以前辐益,對其他事務是可不見的
持久性(durability)? 一旦事務提交,則其所作的修改就會永久保存到數(shù)據(jù)庫中
1.3.1 隔離級別? ? ?
?未提交讀? 提交讀? 可重復讀? 可串行化
較低級別的隔離通惩阎ǎ可以執(zhí)行更高的并發(fā)智政,系統(tǒng)的開銷也更低
隔離級別? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 臟讀可能性? ? ? ? 不可重復讀可能性? ? ? 幻讀可能性? ? ? 加鎖讀
READ UNCOMMITTED? ? ? ? ? ? ? Yes? ? ? ? ? ? ? ? ? ? ? Yes? ? ? ? ? ? ? ? ? ? ? ? ? ?Yes? ? ? ? ? ? ? ? No
READ COMMITTED? ? ? ? ? ? ? ? ? ?No? ? ? ? ? ? ? ? ? ? ? ? Yes? ? ? ? ? ? ? ? ? ? ? ? ? ?Yes? ? ? ? ? ? ? ?No
REPEATABLE READ? ? ? ? ? ? ? ? ? No? ? ? ? ? ? ? ? ? ? ? ? No? ? ? ? ? ? ? ? ? ? ? ? ? ? Yes? ? ? ? ? ? ? ?No
SERIALIZABLE? ? ? ? ? ? ? ? ? ? ? ? ? ?No? ? ? ? ? ? ? ? ? ? ? ? No? ? ? ? ? ? ? ? ? ? ? ? ? ? ?No? ? ? ? ? ? ? ?Yes
臟讀:事務可以讀取未提交的數(shù)據(jù)
幻讀:當某個事務在讀取某個范圍內(nèi)的記錄時,另外一個事務又在該范圍內(nèi)插入了新的記錄箱蝠,當之前的事務再次讀取該范圍的記錄時续捂,會產(chǎn)生幻行
1.3.2 死鎖
死鎖是指兩個或多個事務在同一資源上互相占用,并請求鎖定對方占用的資源宦搬,從而導致惡行循環(huán)的現(xiàn)象
InnoDB目前處理死鎖的方式是牙瓢,將持有最少行級排他鎖的事務進行回滾。
死鎖的產(chǎn)生有雙重原因:有些事因為真正的數(shù)據(jù)沖突间校,這種情況通常很難避免矾克,但有些則完全是由于存儲引擎的實現(xiàn)方式導致的。
1.3.3 事務日志
事務日志可以幫助提高事務的效率憔足。使用事務日志胁附,存儲引擎在修改表的數(shù)據(jù)時只需要修改其內(nèi)存拷貝差购,再把改修改行為記錄到持久在硬盤上的事務日志中,而不用每次都將修改的數(shù)據(jù)本書持久到磁盤汉嗽。事務日志采用的時追加的方式,因此寫日志的操作時磁盤上一小塊區(qū)域內(nèi)的順序I/O找蜜,而不想隨機I/O需要在磁盤的多個地方移動磁頭饼暑,所以采用事務日志的方式相對來說要快得多。事務日志持久以后洗做,內(nèi)存中被修改的數(shù)據(jù)在后臺可以慢慢地刷回磁盤弓叛。
1.3.4 MySQL 中的事務
自動提交(AUTOCOMMIT):
當AUTOCOMMIT=0時,所有的查詢都是在一個事務中诚纸,直到顯示地執(zhí)行COMMIT提交或者ROLLBACK回滾撰筷,該事務結(jié)束,同時又開始了另一個新事務畦徘。
在事務中混合使用存儲引擎
MySQL服務器層不管理事務毕籽,事務是由下層地存儲引擎實現(xiàn)地。==>在同一個事務中井辆,使用多重引擎是不可靠的关筒。
隱式和顯式鎖定
在事務執(zhí)行過程中,隨時都可以鎖定杯缺,鎖只有在執(zhí)行COMMIT或者ROLLBACK的時候才會釋放蒸播,并且所有的鎖是在同一時刻釋放。前面描述的鎖定都是隱式鎖定萍肆,InnoDB回根據(jù)隔離級別在需要的時候自動加鎖袍榆。
InnoDB也支持通過特定的語句進行顯式鎖定,這些語句不屬于SQL規(guī)范
SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
1.4 多版本并發(fā)控制? MVVC
SELECT
InnoDB 只查找版本早于當前事務版本的數(shù)據(jù)行(也就是塘揣,行的系統(tǒng)版本號小于或者等于事務的系統(tǒng)版本號)確保事務讀取的行包雀,要么是在事務開始前已經(jīng)存在的,要么是事務自身插入或者修改過的勿负。
行的刪除版本要么未定義馏艾,要么大于當前事務版本號。這可以確保事務讀取到的行奴愉,在事務開始之前未被刪除琅摩。
INSERT
InnoDB 為新插入的每一行保存當前系統(tǒng)版本號作為行版本號
DELETE
InnoDB為刪除的每一行保存當前版本號作為行刪除標識
UPDATE
InnoDB 為插入一行新紀錄,保存當前系統(tǒng)版本號作為行版本號锭硼,同時保存當前系統(tǒng)版本號到原來的行作為行刪除標識房资。
MVVC只在REPEATABLE READ 和 READ COMMITTED 兩個隔離級別下工作。
READ UNCOMMITTED總是讀取足心的數(shù)據(jù)行檀头,而不是符合當前事務版本的數(shù)
據(jù)行轰异,而SERIALIZABLE? 則會對所有讀取的行都枷鎖岖沛。
1.5 MySQL存儲引擎
1.5.1 InnoDB 存儲引擎
被設(shè)計用來處理大量的短期事務
InnoDB的數(shù)據(jù)存儲在表空間中,表空間是InnoDB管理的一個黑盒子搭独,由一系列的數(shù)據(jù)文件組成
InnoDB采用MVCC來支持高并發(fā)婴削,并且實現(xiàn)了四個標準的隔離級別。其默認級別是REPEATABLE READ 牙肝,并且通過間隙鎖策略防止幻讀的出現(xiàn)唉俗。
支持熱備份? 其他引擎不支持
1.5.2 MyISAM 存儲引擎(數(shù)據(jù)文件.MYD? 索引文件.MYI)
支持全文索引、壓縮配椭、空間函數(shù)等嵌施,但不支持事務和行級鎖颂翼,崩潰后無法恢復
特性:
加鎖與并發(fā):? 對整張表加鎖。
修復
支持全文索引
延遲更新索引鍵? 寫入內(nèi)存的鍵緩存區(qū)
如果表在創(chuàng)建并導入數(shù)據(jù)以后,不會再進行修改操作族奢,那么這樣的表或許適合采用MyISAM壓縮表
1.5.3 內(nèi)建的其他存儲引擎
Archive:只支持select 和 insert碧信,每次SELECT查詢都需要全表掃描耕蝉,支持行級鎖和專用的緩沖區(qū)铐刘,可以實現(xiàn)高并發(fā)的插入,適合日志和數(shù)據(jù)采集類應用镰惦,或者一些需要更快速insert操作的場合寄雀。
Blackhole:沒有實現(xiàn)任何的存儲機制,會丟棄所有插入的數(shù)據(jù)陨献,不做任何保存盒犹。可以用于復制數(shù)據(jù)到備庫眨业,或者只是簡單地記錄到日志急膀。
CSV:可以將普通地csv文件(逗號分割值的文件)作為MySQL的表來處理,但不支持索引龄捡∽可可以作為一種數(shù)據(jù)交換的機制
Federated:訪問其他MySQL服務器的一個代理,最初設(shè)計初衷是為了和SQL Server聘殖、Oracle競爭晨雳。默認禁用
Memory:需要快速地訪問數(shù)據(jù),并且這些數(shù)據(jù)不會被修改奸腺,重啟后丟失也沒關(guān)系餐禁,那么使用Memory表是非常有用的。
場景:
用于查找或者映射表突照,例如將郵編和州名映射的表
用于緩存周期性聚合數(shù)據(jù)的結(jié)果
用于保存數(shù)據(jù)分析中產(chǎn)生的中間數(shù)據(jù)
缺點:
表級鎖帮非,并發(fā)寫入性能低
不支持BLOB 和TEXT類型的列,并且每行的長度是固定的。(即使指定了VARCHAR末盔,實際存儲時也會轉(zhuǎn)換為CHAR筑舅,導致內(nèi)存浪費)
Merge:MyISAM引擎的一個變種。? 是由多個MyISAM表合并而來的虛擬表陨舱。 用于日志或者數(shù)據(jù)倉庫類應用
NDB集群:
1.5.5 引擎選型
事務? InnoDB? XtraDB
不需要事務? 主要是SELECT和INSERT操作? ? MYISAM
備份? InnoDB(在線熱備份)
崩潰恢復? InnoDB
特有的特性
日志型應用:MyISAM? Archive(開銷低翠拣,插入速度快)
CD-ROM應用? MyISAM