前言
这里主要是 探讨, 在我们创建了一个 无主键的数据表, 然后 mysql 会为我们增加的这一个 DB_ROW_ID 的相关
新建一个无主键字段的数据表如下
CREATE TABLE `implicit_id_table` (
`username` varchar(16) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
执行新增处理
执行 sql 如下 “insert into implicit_id_table values ('lucy', 222);”
然后 我们来看一下 这个新增处理的上下文
虽然 我们只有两个字段, username 和 age
以及数据库本身业务需要 trxId 和 rollPtr
数据库本身还为我们增加了一个 聚簇索引, 这里字段名称为 DB_ROW_ID, 长度为 6
查询 DB_ROW_ID 的这一个字段的信息
可以看到 mtype 为 8, 表示的是 DATA_SYS 为 mysql 生成的 系统字段, 数据类型定义在 data0type.h 中
本次插入的记录信息, 拆解如下, username 为 lucy, age 为 222
DB_ROW_ID 字段的处理
row_id 的处理是通过 dict_sys_get_new_row_id 函数来获取的
然后拷贝到了 node->row_id_buf, 等价于 node->row->fields[DB_ROW_ID]->data
所以 后面 插入记录的时候, 拷贝记录的时候 能够从 node->row->fields[DB_ROW_ID] 中获取数据
为 DB_ROW_ID, DB_TRX_ID, DB_POLL_PTR 分配存储空间的地方
DB_ROW_ID 的计算方式, 是从 dict_sys->row_id 中获取的, 并自增
这个 dict_sys 是全局的, 假设现在 dict_sys->row_id 为 555
假设有 implicit_id_table_02, 然后增加了 两条记录, 之后再向 implicit_id_table 中增加记录, 得到的 DB_ROW_ID 为 558
DB_TRX_ID 字段的处理
同理 事务id 字段的处理如下, 通过 node->trx_id_buf 来进行查询
这个处理是在 DB_ROW_ID 处理之前, 填充了 trxId 字段的数据值
如何创建的 DB_ROW_ID 字段 ?
创建表的时候, 创建了该 三个系统字段, DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR
如果是 普通的存在主键字段的数据表, 在这里 DB_ROW_ID 的处理的地方是 直接 return 了
因为 DB_ROW_ID 是某主键字段, 或者某唯一索引字段, 业务侧有传递, 或者 有自增长配置
完