高性能MySQL概述
MySQL邏輯架構
-
大多數MySQL核心功能都在第二層架構,包括查詢解析、分析、優化、緩存以及所有的內置函數,所有跨存儲引擎的功能都在這一層實現:存儲過程、觸發器、視圖等。
-
第三層包含了存儲引擎。存儲引擎負責MySQL中數據的存儲與提取。但存儲引擎不會去解析SQL(InnoDB是個例外,它會解析外鍵定義)。
事務的ACID
- 原子性(atomicity):一個事務必須被視為一個不可分割的最小工作單元。
- 一致性(consistency):數據庫總是從一個一致性狀態轉換到另外一個一致性的狀態。
- 隔離性(isolation):通常來說,一個事務所做的修改在最終提交之前,對其他事務是不可見的。
- 持久性(durability):一旦事務提交,則其所做的修改就會永久保存到數據庫中。
隔離級別
四種隔離級別
-
Read Uncommitted(未提交讀)
在Read Uncommitted級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據。這也被稱為臟讀(Dirty Read)。
-
Read Commited(提交讀)
大多數數據庫系統默認隔離級別都是Read Commited(但MySQL不是)。在這個級別,一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。但會出現不可重復讀(norepeatable read)。因為兩次執行同樣的查詢,可能會得到不一樣的結果、如:事務A首先讀取了一條數據,然后執行邏輯的時候,事務B將這條數據改變了,然后事務A再次讀取的時候,發現數據不匹配了,就是所謂的不可重復讀了。
-
Repeatable Read(可重復讀)
(MySQL默認隔離級別)該級別保證了在同一事務中多次讀取同樣記錄的結果是一致的。但會出現幻讀(Phantom Read)的問題。所謂幻讀,指的是當某個事務在讀取某個范圍內的記錄時,另外一個事務又在該范圍內插入了新的記錄,當之前的事務再次讀取該范圍的記錄時,會產生幻行(Phantom Row)。Innodb和XtraDB存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。
-
Serializable(可串行化)
最高的隔離級別。它通過強制事務串行執行。Serializable會在讀取的每一行數據上都加鎖。
| Read Uncommitted | Yes | Yes | Yes | No |
| Read Commited | No | Yes | Yes | No |
| Repeatable Read | No | No | Yes | No |
| Serializable | No | No | No | Yes |
MVCC(多版本并發控制)
MVCC的實現是通過保存數據在某個時間點的快照來實現的。也就說,不管需要執行多長時間,每個事務看到的數據都是一致的。根據事務開始的時間不同,每個事務對同一張表,同一時刻看到的數據可能是不一樣的。
Innodb的MVCC是通過在每行記錄后面保存兩個隱藏列來實現的,一個保存了行的創建時間,一個保存行的過期時間(或刪除時間)。當然存儲的并不是實際時間值,而是系統版本號。每開始一個事務,系統版本號就會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。
在Repeatable Read隔離級別下,MVCC具體操作:
SELECT:
? Innodb會根據以下兩個條件檢查每行記錄:
? a. Innodb只查找版本早于當前事務版本的數據行(也就是,行的系統版本號小于或等于事務的系統版本號)。這樣可以確保事務讀取的行,要么是在事務開始之前已經存在的,要么是事務自身插入或者修改過的。
? b. 行的刪除版本要么未定義,要么大于當前事務版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。
只有符合上述兩個條件的記錄,才能返回作為查詢結果。
INSERT:
? Innodb為新插入的每一行保存當前系統版本號作為行版本號。
DELETE:
? Innodb為刪除的每一行保存當前系統版本號作為行刪除標識。
UPDATE:
? Innodb為插入一行新記錄,保存當前系統版本號作為行版本號,同時保存當前系統版本號到原來的行作為行刪除標識。
保存這兩個額外系統版本號,使大數讀操作都可以不用加鎖。MVCC只在Repeatable Read和Read Commited兩個隔離級別下工作。因為Read Uncommitted總是讀取最新的數據行,而不是符合當前事務版本的數據行。而Serializable則會對所有讀取的行都加鎖。
InnoDB和MyISAM存儲引擎
InnoDB存儲引擎
- InnoDB的數據存儲在表空間(tablespace)。表空間是由InnoDB管理的一個黑匣子,由一系列的數據文件組成。
- InnoDB采用MVCC來支持高并發,并且實現了四個標準的隔離級別,其默認級別是REPEATABLE READ(可重復讀),并通過間隙鎖(next-key locking)策略防止幻讀的出現。間隙鎖使得InnoDB不僅僅鎖定查詢所涉及的行,還會對索引中的間隙進行鎖定,以防止幻影行的插入。
- InnoDB表示基于聚簇索引建立的。
- InnoDB內部做了很多優化,包括從磁盤讀取數據時采用的可預測性讀,能夠自動在內存中創建hash索引以加速讀操作的自適應哈希索引(adaptive hash index),以及能夠加速插入操作的插入緩沖區(insert buffer)等。
- 事務型的存儲引擎。
MyISAM存儲引擎
- 不支持事務和行級鎖,崩潰后無法安全恢復。
- 將表存儲在兩個文件中:數據文件(.MYD)和索引文件(.MYI)。MyISAM數據以緊密格式存儲。
- MyISAM對整張表加鎖,而不是針對行。讀取時加共享鎖,寫入時則對表加排他鎖。但是在表有讀取查詢的同時,也可以往表中插入新的記錄。(并發插入 CONCURRENT INSERT)
- 支持全文索引。
- 延遲更新索引鍵(Delayed Key Write)。創建MyISAM 表的時候,如果指定了DELAY_KEY_WRITE選項,在每次修改執行完成時,不會立刻將修改的索引數據寫入磁盤,而是會寫到內存中的鍵緩沖區(in-memory key buffer),只要在清理鍵緩沖區或者關閉表的時候才會將對應的索引塊寫入到磁盤。這種方式可以極大地提升寫入性能,但是在數據或者主機崩潰時造成索引損壞。
- MyISAM壓縮表。如果表在創建并導入數據后,不會再進行修改操作,那么這樣的表或許適合采用MyISAM壓縮表。
總結
以上是生活随笔為你收集整理的高性能MySQL概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python- 进阶 与flask的搭
- 下一篇: 第六十五期:IBM净利润下降38%,旧时