MySQL
1 數(shù)據(jù)庫事務(wù)的特性(ACID)
A, atomacity 原子性 事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。
通常,與某個(gè)事務(wù)關(guān)聯(lián)的操作具有共同的目標(biāo),并且是相互依賴的。如果系統(tǒng)只執(zhí)行這些操作的一個(gè)子集,
則可能會(huì)破壞事務(wù)的總體目標(biāo)。原子性消除了系統(tǒng)處理操作子集的可能性。
C, consistency 一致性 事務(wù)將數(shù)據(jù)庫從一種一致狀態(tài)轉(zhuǎn)變?yōu)橄乱环N一致狀態(tài)。
也就是說,事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)(各種 constraint 不被破壞)。
I, isolation 隔離性 由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。
事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),
事務(wù)不會(huì)查看中間狀態(tài)的數(shù)據(jù)。換句話說,一個(gè)事務(wù)的影響在該事務(wù)提交前對其他事務(wù)都不可見。
D, durability 持久性 事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)致命的系統(tǒng)故障也將一直保持。
2 臟讀 幻讀 不可重復(fù)讀
3 事物隔離級別
1 讀未提交(Read uncommitted)
就是一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù)。
2 讀提交(Read committed)
就是一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù)。
3 重復(fù)讀(Repeatable read) 重復(fù)讀是 Mysql 的默認(rèn)隔離級
就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時(shí),不再允許修改操作
4 Serializable 序列化
最高的事務(wù)隔離級別,在該級別下,事務(wù)串行化順序執(zhí)行,
可以避免臟讀、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級別效率低下,比較耗數(shù)據(jù)庫性能
4 事物隔離的實(shí)現(xiàn)
1 行級鎖 INNODB引擎
行級鎖是Mysql中鎖定粒度最細(xì)的一種鎖,表示只針對當(dāng)前操作的行進(jìn)行加鎖。
行級鎖能大大減少數(shù)據(jù)庫操作的沖突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖 和 排他鎖。
特點(diǎn) 開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
2 表級鎖 MYISAM引擎
表級鎖是MySQL中鎖定粒度最大的一種鎖,表示對當(dāng)前操作的整張表加鎖,它實(shí)現(xiàn)簡單,資源消耗較少,
被大部分MySQL引擎支持。最常使用的MYISAM與INNODB都支持表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨(dú)占寫鎖(排他鎖)。
特點(diǎn) 開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)出鎖沖突的概率最高,并發(fā)度最低。
3 頁級鎖 BDB引擎
頁級鎖是MySQL中鎖定粒度介于行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但沖突多,行級沖突少,但速度慢。
所以取了折衷的頁級,一次鎖定相鄰的一組記錄。
特點(diǎn) 開銷和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般
5 SQL的生命周期
1 應(yīng)用服務(wù)器與數(shù)據(jù)庫服務(wù)器建立一個(gè)連接
2 數(shù)據(jù)庫進(jìn)程拿到請求sql
3 解析并生成執(zhí)行計(jì)劃,執(zhí)行
4 讀取數(shù)據(jù)到內(nèi)存并進(jìn)行邏輯處理
5 通過步驟一的連接,發(fā)送結(jié)果到客戶端
6 關(guān)掉連接,釋放資源
6 樂觀鎖與悲觀所
1 樂觀鎖 每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在提交更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù)。
樂觀鎖適用于讀多寫少的應(yīng)用場景,這樣可以提高吞吐量。
2 悲觀鎖 先獲取鎖,再進(jìn)行業(yè)務(wù)操作,即“悲觀”的認(rèn)為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進(jìn)行業(yè)務(wù)操作。
7 索引
1 主鍵索引: 數(shù)據(jù)列不允許重復(fù),不允許為NULL.一個(gè)表只能有一個(gè)主鍵
2 唯一索引: 數(shù)據(jù)列不允許重復(fù),允許為NULL值,一個(gè)表允許多個(gè)列創(chuàng)建唯一索引。
3 普通索引: 基本的索引類型,沒有唯一性的限制,允許為NULL值。
4 全文索引: 是目前搜索引擎使用的一種關(guān)鍵技術(shù)。
8 最左前綴
最左優(yōu)先,在創(chuàng)建多列索引時(shí),要根據(jù)業(yè)務(wù)需求,where子句中使用最頻繁的一列放在最左邊
9 索引算法 BTree Hash