当前位置:   article > 正文

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

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

前言

这里主要是 探讨, 在我们创建了一个 无主键的数据表, 然后 mysql 会为我们增加的这一个 DB_ROW_ID 的相关 

新建一个无主键字段的数据表如下 

  1. CREATE TABLE `implicit_id_table` (
  2. `username` varchar(16) DEFAULT NULL,
  3. `age` int(11) DEFAULT NULL
  4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

 

执行新增处理

执行 sql 如下 “insert into implicit_id_table values ('lucy', 222);”

然后 我们来看一下 这个新增处理的上下文

虽然 我们只有两个字段, username 和 age 

以及数据库本身业务需要 trxId 和 rollPtr

数据库本身还为我们增加了一个 聚簇索引, 这里字段名称为 DB_ROW_ID, 长度为 6

5830e40c74b380f9e3ef0c68a73710e7.png

 

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

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

13888e0762daa1e748fb509b856c18d6.png

 

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

c397cb6bba78bb8ebd75c222249850b8.png

 

 

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

c2980d61fc14361cd65c4addb15c115d.png

 

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

bc6a285afdbe38bd19daf4b4b7edb768.png

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

66a87c816ae148d3fd0aa7cd83abd89c.png

 

 

DB_TRX_ID 字段的处理

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

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

8ff0b8ee813a70a723751437959f3b9a.png

 

 

如何创建的 DB_ROW_ID 字段 ?

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

3ac7566752a29fb65a3c6e62aef8e004.png

 

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

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

b4cf0aeea3dd3d94c9ca249c9951fcce.png

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/1014644
推荐阅读
相关标签
  

闽ICP备14008679号