没有主键真的可怕吗
讨论这个问题之前,我们先大概说明一下InnoDB的一些行为。我们都知道每个InnoDB存储引擎表都有一个聚簇索引,在有主键的情况下,主键索引就是这个聚簇索引。MySQL官方文档(14.6.2.1 Clustered and Secondary Indexes)有说明:
如果表没有主键,甚至都没有唯一键索引的话,InnoDB内部会基于一个包含了ROW_ID值的列生成一个隐式的聚簇索引,行都会根据这个ROW_ID排序。ROW_ID是一个6个字节,即48位的单调递增字段。有新数据插入时,就会生成一个新的递增的ROW_ID。所以,根据ROW_ID排序的行,本质上是按照插入顺序排序。
需要说明的是,这个单调递增的ROW_ID,和我们平时申明主键时指定AUTO_INREMENT的实现逻辑是完全不一样的。
-
隐式ROW_ID实现
这个在既没有主键,也没有一个非空唯一键的InnoDB表中自动添加的被称为ROW_ID的列,既不能被任何查询访问,也不能被内部(例如基于行的复制)使用。
更坑爹的是,所有用ROW_ID列的表,共享同一个被保存在数据字典中的全局序列数,且下一个将要使用的值被保存在系统表空间的page 7(type SYS),数据字段头里(字段名为DICT_HDR_ROW_ID
)。
这个全局序列计数器被
版权声明:本文为weixin_39627405原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。