前言

这里主要是 探讨, 在我们创建了一个 无主键的数据表, 然后 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

51 无显式主键时 mysql 增加的 DB_ROW_ID_id

 

查询 DB_ROW_ID 的这一个字段的信息

可以看到 mtype 为 8, 表示的是 DATA_SYS 为 mysql 生成的 系统字段, 数据类型定义在 data0type.h 中 

51 无显式主键时 mysql 增加的 DB_ROW_ID_mysql_02

 

本次插入的记录信息, 拆解如下, username 为 lucy, age 为 222

51 无显式主键时 mysql 增加的 DB_ROW_ID_id_03

 

 

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] 中获取数据 

51 无显式主键时 mysql 增加的 DB_ROW_ID_DB_ROW_ID_04

 

为 DB_ROW_ID, DB_TRX_ID, DB_POLL_PTR 分配存储空间的地方

51 无显式主键时 mysql 增加的 DB_ROW_ID_主键_05

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

51 无显式主键时 mysql 增加的 DB_ROW_ID_mysql_06

 

 

DB_TRX_ID 字段的处理

同理 事务id 字段的处理如下, 通过 node->trx_id_buf 来进行查询 

这个处理是在 DB_ROW_ID 处理之前, 填充了 trxId 字段的数据值 

51 无显式主键时 mysql 增加的 DB_ROW_ID_DB_ROW_ID_07

 

 

如何创建的 DB_ROW_ID 字段 ?

创建表的时候, 创建了该 三个系统字段, DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR

51 无显式主键时 mysql 增加的 DB_ROW_ID_DB_ROW_ID_08

 

如果是 普通的存在主键字段的数据表, 在这里 DB_ROW_ID 的处理的地方是 直接 return 了

因为 DB_ROW_ID 是某主键字段, 或者某唯一索引字段, 业务侧有传递, 或者 有自增长配置

51 无显式主键时 mysql 增加的 DB_ROW_ID_id_09