数据库 学习总结
文章目錄
- mysql基礎(chǔ)
- mysql查詢流程
- mysql的頁(yè)
- mySQL索引
- 事務(wù)
- 事務(wù)的特性
- 事務(wù)的開(kāi)啟與關(guān)閉
- redo
- undo
- 事務(wù)并發(fā)存在的一致性問(wèn)題
- 事務(wù)隔離級(jí)別
- MVCC 和readView
- x鎖 和 s鎖
mysql基礎(chǔ)
mysql查詢流程
mysql的頁(yè)
mysql中各個(gè)數(shù)據(jù)頁(yè)可以組成一個(gè)雙向鏈表,每個(gè)數(shù)據(jù)頁(yè)中的記錄按照主鍵值從小到大的順序組成一個(gè)單鏈表。
每個(gè)數(shù)據(jù)頁(yè)都會(huì)存儲(chǔ)在它里面的記錄生成一個(gè)頁(yè)目錄。
頁(yè)目錄中是對(duì)數(shù)據(jù)主鍵分組形成的槽,查找是利用二分法可以查找到槽所指向的分組,然后遍歷分組,可以得到記錄數(shù)據(jù)。
mySQL索引
mySQL的索引常見(jiàn)的是B+樹(shù)索引,(innoDB還會(huì)自動(dòng)生成哈希索引)。B+樹(shù)是一種平衡樹(shù),所有數(shù)據(jù)都保存在葉子節(jié)點(diǎn),在葉子節(jié)點(diǎn)之上的節(jié)點(diǎn)只保存鍵值和頁(yè)值。還可以簡(jiǎn)歷二級(jí)索引,就是建立不是按照逐漸排序的索引,二級(jí)索引能提高檢索效率,但是會(huì)降低插入,刪除操作的效率。
事務(wù)
事務(wù)的特性
原子性:一個(gè)事務(wù)只能發(fā)生或者不發(fā)生,一個(gè)食物中的操作不可分割
一致性:數(shù)據(jù)庫(kù)中的數(shù)據(jù)與真實(shí)數(shù)據(jù)具有一致性
隔離性:多個(gè)事務(wù)之間不影響
持久性:事務(wù)一旦提交,就會(huì)永久有效
事務(wù)的開(kāi)啟與關(guān)閉
開(kāi)啟:begin 或者 start transaction args
提交:commit:(也可以隱式提交)
回滾(中止):rollback
保存點(diǎn):savepoint,當(dāng)事務(wù)比較長(zhǎng)的時(shí)候中間可以用保存點(diǎn)保存。
redo
redo的存在是為了保證事務(wù)的持久性,就是說(shuō)當(dāng)提交了事務(wù)之后,提交的事務(wù)應(yīng)該被刷新到磁盤(pán)中,但是如果每次提交修改就將整個(gè)頁(yè)刷新非常浪費(fèi)時(shí)間,所以每次只需要把修改的記錄日志redo刷新到磁盤(pán)中就可以了,這樣如果系統(tǒng)崩潰了,可以借用redo日志文件恢復(fù)系統(tǒng)。
(這里面還有很多技術(shù)細(xì)節(jié))
undo
記錄恢復(fù)修改操作的日志
事務(wù)并發(fā)存在的一致性問(wèn)題
臟寫(xiě):一個(gè)事務(wù)修改另一個(gè)未提交事務(wù)修改的數(shù)據(jù)
臟讀:一個(gè)事務(wù)讀取另一個(gè)未提交事務(wù)修改的數(shù)據(jù)’
不可重復(fù)讀:一個(gè)事務(wù)修改另一個(gè)未提交事務(wù)讀取的數(shù)據(jù)
幻讀:在未提交的檢索事務(wù)的時(shí)候?qū)懭肓藵M足檢索要求的記錄。
事務(wù)隔離級(jí)別
mysql中設(shè)置事務(wù)隔離級(jí)別的語(yǔ)句:
set [GLOBAL|SESSION] transaction isolation level
MVCC 和readView
MVCC就是多版本并發(fā)訪問(wèn)控制,具體就是維護(hù)一個(gè)版本鏈和創(chuàng)建readview,通過(guò)版本鏈和readview來(lái)實(shí)現(xiàn)在read comimitted 和 repeatable read隔離級(jí)別下執(zhí)行,保證讀寫(xiě)和寫(xiě)讀操作的并發(fā)執(zhí)行。
MVCC的版本鏈:當(dāng)對(duì)記錄更新 修改 添加等操作時(shí)生成一個(gè)版本連,每一條記錄都有一個(gè)非減trx_id標(biāo)記。trx_id代表事務(wù)發(fā)生的先后順序。
ReadView:
readView主要是記錄當(dāng)前事務(wù)中哪些事務(wù)還沒(méi)有提交,以此保證訪問(wèn)到的都是已經(jīng)提交的事務(wù)。readView中的數(shù)據(jù)如下:
m_ids :記錄中當(dāng)前系統(tǒng)中活躍的事務(wù)trx_id鏈表
min_trx_id:最小的活躍事務(wù)trx_id
max_trx_id:在生成readview是系統(tǒng)應(yīng)該分配給下一個(gè)事務(wù)的trx_id.
配合使用 將版本鏈中事務(wù)的trx_id與readview中的記錄比較,當(dāng)trx_id小于min_trx_id 或者大于min_trx_id但是小于max_trx_id而且不在m_ids中,表示這條事務(wù)可見(jiàn),如果大于等于max_trx_id或者在m_ids中,則表示這條記錄不可見(jiàn),需要看下一條。
x鎖 和 s鎖
X鎖 排他鎖,當(dāng)進(jìn)行寫(xiě)操作時(shí),對(duì)記錄加上X鎖,其他操作就無(wú)法獲得加鎖的機(jī)會(huì)
s鎖 共享鎖 ,當(dāng)進(jìn)行讀操作時(shí),對(duì)記錄加上S鎖,可以允許繼續(xù)加S鎖,不能加X(jué)鎖。
也就是X鎖和S鎖實(shí)現(xiàn)了 讀-讀 并發(fā)可以,讀寫(xiě) 寫(xiě)讀 寫(xiě)寫(xiě) 并發(fā)不可以。
S鎖和X鎖的粒度可以在表級(jí)也可以在行級(jí),在表級(jí)加鎖后還可以在行級(jí)加鎖,規(guī)則同上。
總結(jié)
- 上一篇: C++ 线程池的思想
- 下一篇: raise errorclass(err