MySQL概要——《深究MySQL》
1. MySQL架構
MySQL的存儲引擎架構將查詢處理等系統任務和數據的存或取相分離。這種分離設計使得可根據不同的需求選擇不同的存儲方式。
存儲引擎不會解析SQL,InnoDB例外,它會解析外鍵定義,因為MySQL服務器本身沒有實現該功能。
MySQL會解析查詢并創建內部數據結構(解析樹),然后對其進行重寫查詢、決定表的讀取順序、選擇合適的索引等優化。
2. 鎖
讀鎖(也叫共享鎖),互不干擾。只有沒有寫鎖時,其他用戶才能獲得讀鎖。
寫鎖(也叫排他鎖),會阻塞其他的讀鎖和寫鎖。
鎖的各種操作,包括獲得鎖、檢查鎖是否已經刪除、釋放鎖等都會增加系統開銷。
鎖策略:在鎖的開銷和數據安全性之間尋求平衡。
每種MySQL存儲引擎都能自定義鎖策略和鎖粒度。
表鎖:會銷定整張表,它是MySQL中最基本的鎖策略,也是開銷最小的鎖策略。
行級鎖:支持最大程度的并發處理(開鎖也大),它只在存儲引擎層實現,而在MySQL服務層中沒有實現。
死鎖:兩個或者多個事務都在請求鎖定對方占用的資源的現象。
解決死鎖辦法:部分全部回滾其中一個事務
死鎖示例:當兩個事務同時執行完第一句SQL,緊接著執行第二句SQL時就會發現資源被對方占用
事務1:
start transaction
update user set age = 20 where userId=3;
update user set age = 20 where userId=4;
事務2:
start transaction
update user set age = 20 where userId=4;
update user set age = 20 where userId=3;
鎖只有在事務commit(提交)或rollback(回滾)的時候才會釋放,且所有的鎖都在同一時刻釋放。
3. 事務
3.1 事務的幾個特性
原子性(atomicity): 一個事務是一個最小的邏輯執行單元
一致性(consistency): 數據庫數據在邏輯上要保持一致。如一個用戶轉出了200,那另一個用戶必須增加200元。
隔離性(isolation): 一個事務的修改在最終提交之前,其他事務是不可見的。即不能影其他事務。
持久性(durablility): 事務最終提交之后,修改就要被永遠保存在數據庫中,而不會像回滾一樣能撤銷。
3.2 隔離級別
read uncommitted(讀未提交):一個事務可以讀到另一個事務未提交的數據。會有“臟讀”、“不可重復讀”、“幻讀”的問題。
read committed(讀提交:大多數據庫默認級別): 一個事務只能讀到另一個事務提交后的修改。會有“不可重復讀”、“幻讀”的問題。
repeatable read(可重復讀:MySQL默認級別):在一個事務中多次讀取同一個記錄時,結果一樣。
【這是因為該事務鎖住了這條數據記錄,其他事務不能作任何修改(但可讀),所以多次讀取同一記錄時結果一樣】
會有“幻讀”的問題。幻讀指的是某個事務兩次讀取某范圍內的數據時,數據不一致。
serializable:事務會串行執行。此時會在讀取的每一行數據都加鎖,就會可能導致超時和爭鎖的問題。
低的隔離級別可以執行更高的并發,系統開銷也相對較低。
3.3 MySQL中的事務
MySQL中的兩種事務型存儲引擎:InnoDB、NDB Cluster
DDL(create alter drop等)、DCL(grant,deny,revoke等與用戶角色權限相關操作)會強制自動提交事務,DML(select、update、insert、delete等)需要手動提交事務
3.4 事務日志
作用:提高事務的效率
原理: 存儲引擎在修改表的數據時,只會修改其內存拷貝,然后把該修改操作持久到硬盤上的事務日志中,而不用每次都將修改的數據本身持久到磁盤上。事務日志持久以后,內存中被修改的數據在后臺可以慢慢地刷回到磁盤。此方式稱之為,預寫式日志,修改數據需要寫兩次磁盤。
快的原因:事務日志采用的是追加的方式,寫事務日志的操作是磁盤上的順序I/O,而不像隨機I/O要在磁盤上多個地方移動磁頭。
另一個優點:如果數據的修改已經紀錄到事務日志中,但數據本身還沒有寫回磁盤,如果此時系統崩潰,存儲引擎在重啟時,能夠自動恢復這部分修改的數據
開啟事務日志:待查?????
4. 多版本并發控制(MVCC: multi-version concurrency control)
MVCC定義:多版并發控制系統??烧J為是行級鎖的一個變種,它能夠避免更多情況下的加鎖操作。
作用:避免一些加鎖操作,提升并發性能。
實現:通過在每行記錄的后面保存行的創建時間和過期時間或刪除時間(它們是隱藏的),這兩個時間實際都是系統的版本號。每開始一個新的事務,版本號都會自動增加。
具體原理
4.1) select:innoBD查詢時會檢查以下兩個條件:一個是數據行的版本號早于當前事務的版本號;另一個是行的刪除版本號,要么沒有,要么大于當前事務的版本號。
4.2)insert/delete:innoDB將當前的系統版本號作為新插入(刪除)的數據行的版本號。
4.3)update:先新插入一行數據,并將當前系統版本號作為行的版本號,同時將當前系統版本號作為原來行的刪除版本號。
注意:MVCC只在read committed和repeatable read兩個隔離級別下工作。
總結
以上是生活随笔為你收集整理的MySQL概要——《深究MySQL》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript中Console的9
- 下一篇: Mybatis中 Integer 值为0