多版本并发控制 MVCC
高性能 MySQL 第3版 1.4 多版本并发控制
MVCC 是通过保存数据在某个时间点的快照实现的。不同存储引擎的 MVCC 的实现不同,典型的有乐观并发控制和悲观并发控制。
即为事务创建某个时间点的读一致性视图,保证不同事务查询看到的读一致性视图不一样。
InnoDB记录存储结构
innodb 的行记录格式有4中。这里分析 Compact 格式。
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) 类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表。
undo log redo log binlog
记录的真实数据
记录的真实数据
除了我们插入的那些列的数据,MySQL
会为每个记录默认的添加一些列(也称为隐藏列
),具体的列如下:
列名 | 是否必须 | 占用空间 | 描述 |
---|---|---|---|
row_id |
否 | 6 字节 |
行ID,唯一标识一条记录 |
transaction_id |
是 | 6 字节 |
事务ID |
roll_pointer |
是 | 7 字节 |
回滚指针 |
需要注意的是,MySQL服务器会为每条记录都添加 transaction_id 和 roll_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