多版本并发控制 MVCC简介

多版本并发控制 MVCC

高性能 MySQL 第3版 1.4 多版本并发控制

MVCC 是通过保存数据在某个时间点的快照实现的。不同存储引擎的 MVCC 的实现不同,典型的有乐观并发控制和悲观并发控制。

即为事务创建某个时间点的读一致性视图,保证不同事务查询看到的读一致性视图不一样。

InnoDB记录存储结构

innodb 的行记录格式有4中。这里分析 Compact 格式。

COMPACT行格式

一条完整的记录其实可以被分为记录的额外信息记录的真实数据两大部分。

记录的额外信息

这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些额外信息分为3类,分别是 变长字段长度列表NULL值列表 记录头信息,我们分别看一下。

变长字段长度列表

前边说过MySQL支持一些变长的数据类型,比如VARCHAR(M)VARBINARY(M)、各种TEXT类型,各种BLOB类型,这些变长的数据类型占用的存储空间分为两部分:

  1. 真正的数据内容
  2. 占用的字节数

W 字符集一个字符最大字节数

M varchar(M) 可变长指定的字符数

L 字段数据实际的字节数

W * M < 256 用1字节存储可变长字段字节数

W * M >= 256

​ L < 128 用1字节存储

​ L >= 128 用2字节存储

对于 CHAR(M) 类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表。

undo log redo log binlog

记录的真实数据

记录的真实数据除了我们插入的那些列的数据,MySQL会为每个记录默认的添加一些列(也称为隐藏列),具体的列如下:

列名 是否必须 占用空间 描述
row_id 6字节 行ID,唯一标识一条记录
transaction_id 6字节 事务ID
roll_pointer 7字节 回滚指针

需要注意的是,MySQL服务器会为每条记录都添加 transaction_idroll_pointer 这两个列,但是 row_id 只有在表没有定义主键的时候才会为记录添加,相当于MySQL服务器帮我们来添加一个主键。这些列的值不用我们操心,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
原文地址:https://www.cnblogs.com/mozq/p/12093747.html