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