1. 程式人生 > >高效能MySql閱讀筆記-第一章

高效能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的併發控制。