对于表中数据的存储,InnoDB存储引擎采用了聚集索引的方式,因此每张表的存储都是按主键的顺序进行存放的。如果没有显示地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的row_id,并以此作为主键。
InnoDB内部维护了一个全局的dict_sys.row_id值,所有无主键的表,每插入一行数据都会将dict_sys.row_id作为自己的row_id,并将dict_sys.row_id+1。
实际上,在代码实现时row_id是一个长度为8字节的无符号长整型(bigint unsigned)。但是,InnoDB在设计时,给row_id留的只是6个字节的长度,这样写到数据表中时只放了最后6个字节,所以row_id能写到数据表中的值,就有两个特征:
- row_id写入表中的值的范围,是从0到2-1。
- 当dict_sys.row_id=2时,如果再有插入数据的行为要来申请row_id,拿到以后再取最后6个字节的话就是0。
所以,也就是说,当row_id达到上限2之后,会从0再开始循环,而且当row_id相同时,新的行会覆盖之前的行。(即在同一个表中,row_id=2的行会覆盖row_id=0的行)。
