高效能MySql閱讀筆記-第一章
1.Mysql的邏輯架構
解釋:
①第一層客戶端:這個不是Mysql特有,譬如Navicat等客戶端工具。
②第二層Mysql核心服務功能:譬如查詢解析,優化,快取處理,以及內建函式,儲存過程,檢視,觸發器等操作。
③第三層儲存引擎:儲存引擎層負責資料的儲存和提取。
2.Mysql併發控制
讀寫鎖
併發控制方式多是採用鎖機制。通常是共享鎖(讀鎖)和排他鎖(寫鎖)。多個客戶在同一個時刻可以同時讀取同一個資源,互不干擾。寫鎖是排他的,也就是說在寫的同時不允許其他的寫鎖來寫和讀鎖來讀。這樣就能防止髒資料的進入。
鎖粒度
提高資源的併發性關鍵在於鎖粒度。在給定的資源上,鎖定的資料量越少,則系統的併發程度越高,只要相互不衝突即可。但是一味的細化鎖,讓鎖的數量上升也會增加系統對資源的消耗。所以真正的鎖策略是在鎖的開銷和資料的安全性之間尋求一種平衡。
①表鎖:
表鎖是Mysql中開銷最小的鎖。它的策略是會鎖定一張表,如果使用者對錶寫入(插入,更新,刪除),就會將表鎖住,同時阻塞其他的使用者對這張表的讀和寫。在某些場景下,寫鎖比讀鎖更高的優先順序。寫鎖請求會插入到讀鎖佇列的前面。
②行鎖:
行鎖是最大程度支援併發處理(鎖開銷最大)。像預設的儲存引擎InnoDB等實現了行鎖。行鎖只在儲存引擎層實現。
3.Mysql事務
①事務的特性ACID
原子性(atomicity)
一個事務必須被視為一個不可分割的最小工作單元。
一致性(consistency)
資料庫總是從一個一致性狀態轉換到另一個一致性狀態。
隔離性(isolation)
一個事務所做的修改在最終提交以前,對其他事務是不可見的。可重複讀(REPEATABLE READ)是Mysql的預設事務隔離級別。
永續性(durabilty)
一旦事務提交,則其所做的修改就會永久儲存到資料庫中。
②死鎖
死鎖是指兩個或者多個事務之間再同一個資源上的相互佔用,並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。InnoDB儲存引擎處理死鎖的方法是將持有最少行級排他鎖的事務進行回滾。
③Mysql中的事務
Mysql預設採用自動提交模式,如果不是顯式地開始一個事務,則每個查詢都被當作一個事務執行提交操作。
設定自動提交:SET AUTOCOMMIT=1;
設定Mysql事務隔離級別:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
4.多版本併發控制MVCC
MVCC的出現是為了提高併發效能。策略就是讀操作是非阻塞的,寫操作只是在需要的行上面阻塞。MVCC的實現就是通過儲存資料在某個時間點的快照來實現的。不同儲存引擎對於MVCC的實現是不同的。典型的有樂觀鎖和悲觀鎖。
儲存引擎InnoDB的MVCC
InnoDB的MVCC採用系統版本號(此處是兩個版本號,一個是刪除版本號,一個是建立版本號),每開始一個新事務,系統版本號都會自動遞增。而當前的快照版本號會和當前的版本號進行比較來操作。
查詢:
a. InnoDB只查詢版本號早於當前事務版本的資料行(行的版本號小於等於事務的系統版本號)。這樣就會避免出現髒讀。
b. 行的刪除版本號要麼未定義,要麼大於當前事務版本號(保證事務讀取的行,在讀之前未被刪除),這樣就不會出現髒讀。
插入:
InnoDB為新插入的每一行儲存當前系統版本號作為行版本號。
刪除:
InnoDB為刪除的每一行儲存當前系統版本號作為刪除標識。
更新:
InnoDB為插入一行新紀錄,儲存當前系統版本號作為行版本號,同時儲存當前系統版本號到原來的行作為行刪除識別符號。
5.Mysql儲存引擎
在檔案系統中,Mysql將每個資料庫儲存為資料目錄下的一個子目錄。建立表時,Mysql會在資料庫子目錄下建立一個和表同名的.frm檔案中儲存該表的定義。Mysql的大小寫敏感性和具體的平臺有關。windows上是不敏感的,而linux上是敏感的。
查詢表本身的資訊:
InnoDB儲存引擎:
InnoDB是Mysql的預設事務型引擎。InnoDB採用MVCC高併發,並且實現了四個標準的隔離級別。其預設級別是REPEATABLE READ(可重複讀),並且通過間隙鎖策略防止出現幻讀。InnoDB表是基於聚簇索引建立的。聚簇索引對主鍵查詢有很高的效能。不過它的二級索引中必須包含主鍵列。所以如果主鍵列很大,其他的所有索引都會很大。
MyISAM儲存引擎:
在Mysql5.1及之前的版本,MyISAM是預設的儲存引擎。MyISAM不支援事務和行級鎖。再有就是崩潰後無法安全恢復。
MyISAM的加鎖與併發:MyISAM對整張表加鎖,而不是行級別。讀取時會對需要讀到的所有表加共享鎖,寫入時對錶加排他鎖。在表讀的時候也可以插入,使用了Mysql的併發控制。