多版本併發控制 MVCC簡介

2022-02-07 02:26:54 字數 4808 閱讀 6606

高效能 mysql 第3版 1.4 多版本併發控制
mvcc 是通過儲存資料在某個時間點的快照實現的。不同儲存引擎的 mvcc 的實現不同,典型的有樂觀併發控制和悲觀併發控制。

即為事務建立某個時間點的讀一致性檢視,保證不同事務查詢看到的讀一致性檢視不一樣。

innodb記錄儲存結構

innodb 的行記錄格式有4中。這裡分析 compact 格式。

一條完整的記錄其實可以被分為記錄的額外資訊記錄的真實資料兩大部分。

記錄的額外資訊

這部分資訊是伺服器為了描述這條記錄而不得不額外新增的一些資訊,這些額外資訊分為3類,分別是變長字段長度列表null值列表記錄頭資訊,我們分別看一下。

變長字段長度列表

前邊說過mysql支援一些變長的資料型別,比如varchar(m)varbinary(m)、各種text型別,各種blob型別,這些變長的資料型別占用的儲存空間分為兩部分:

真正的資料內容

占用的位元組數

w 字符集乙個字元最大位元組數

m varchar(m) 可變長指定的字元數

l 字段資料實際的位元組數

w * m < 256 用1位元組儲存可變長欄位位元組數

w * m >= 256

​ l < 128 用1位元組儲存

​ l >= 128 用2位元組儲存

對於char(m)型別的列來說,當列採用的是定長字符集時,該列占用的位元組數不會被加到變長字段長度列表,而如果採用變長字符集時,該列占用的位元組數也會被加到變長字段長度列表。

記錄的真實資料

記錄的真實資料除了我們插入的那些列的資料,mysql會為每個記錄預設的新增一些列(也稱為隱藏列),具體的列如下:

列名是否必須

占用空間

描述row_id

6位元組

行id,唯一標識一條記錄

transaction_id

6位元組

事務id

roll_pointer

7位元組

回滾指標

需要注意的是,mysql伺服器會為每條記錄都新增transaction_idroll_pointer這兩個列,但是row_id只有在表沒有定義主鍵的時候才會為記錄新增,相當於mysql伺服器幫我們來新增乙個主鍵。這些列的值不用我們操心,mysql伺服器會自己幫我們新增的。

[root@instance-fjii60o3 ~]# ls /var/lib/mysql

db2 ib_logfile0 instance-fjii60o3.err mozq mysql.sock rpm_upgrade_history test

ibdata1 ib_logfile1 instance-fjii60o3.pid mysql performance_schema rpm_upgrade_marker-last

[root@instance-fjii60o3 mysql]# innodb_space -s ibdata1 system-spaces

name pages indexes

(system) 1152 7

[root@instance-fjii60o3 mysql]# pwd

/var/lib/mysql

[root@instance-fjii60o3 mysql]# innodb_space -s ibdata1 -t db2/user space-indexes

id name root fseg fseg_id used allocated fill_factor

11 id_ind 302 internal 144 1 1 100.00%

11 id_ind 302 leaf 145 0 0 0.00%

12 for_ind 303 internal 146 1 1 100.00%

12 for_ind 303 leaf 147 0 0 0.00%

13 ref_ind 304 internal 148 1 1 100.00%

13 ref_ind 304 leaf 149 0 0 0.00%

14 id_ind 305 internal 150 1 1 100.00%

14 id_ind 305 leaf 151 0 0 0.00%

15 primary 307 internal 153 1 1 100.00%

15 primary 307 leaf 154 0 0 0.00%

16 primary 309 internal 156 1 1 100.00%

16 primary 309 leaf 157 0 0 0.00%

17 gen_clust_index 311 internal 159 1 1 100.00%

17 gen_clust_index 311 leaf 160 0 0 0.00%

[root@instance-fjii60o3 mysql]# innodb_space -s ibdata1 -t mozq/record_format_demo space-page-type-summary

type count percent description

allocated 871 75.61 freshly allocated

sys 245 21.27 system internal

index 20 1.74 b+tree index

undo_log 8 0.69 undo log

inode 4 0.35 file segment inode

fsp_hdr 2 0.17 file space header

trx_sys 1 0.09 transaction system header

ibuf_bitmap 1 0.09 insert buffer bitmap

多版本併發控制(MVCC)

mysql的大多數事務性儲存引擎 如innodb 實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要...

多版本併發控制MVCC

大多數mysql的事務性儲存引擎,例如innodb.falcon 和pbxt,不是簡單地使用行加鎖的機制,而是選用一種叫做 多版本併發控制 mvcc,mutiversion concurrency control 的技術,和行加鎖機制關聯使用,以應對更多的併發處理問題。mvcc不是mysql獨有的技...

MVCC(多版本併發控制)

mvcc是資料庫鎖策略的一種實現的統稱。使用mvcc可以在大多數情況下避免加鎖的操作,為服務帶來更好的效率。mysql的大多數事務型儲存引擎實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 不同的資料庫實現mvcc的機制不盡相同。我們可以粗略的認為mv...