【mysql】为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

文章目录

    • 1. 为什么建议InnoDB表必须建主键
    • 2. 为什么推荐使用整型的自增主键?

1. 为什么建议InnoDB表必须建主键

首先,我们知道InnoDB采用B+树作为存储结构,那么必然需要一个列作为key,什么是key?

一个B+树的节点可以存储key、地址、行数据(仅叶子节点),key 就是不重复的值且可以比较(确保树进行分裂时,可以确定是左孩子还是右孩子)。

我们知道主键的特定就是主键的值不可重复,也不可为空,正好符合B+树key的要求

主键特性参见《主键的概念作用及特点》

聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引(确切说会选择一个唯一非空的列作为主键)代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。

InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。

如果你已经设置了主键为聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可

聚簇索引性能最好而且具有唯一性,所以非常珍贵,必须慎重设置。一般要根据这个表最常用的SQL查询方式来进行选择,某个字段作为聚簇索引,或组合聚簇索引,这个要看实际情况

2. 为什么推荐使用整型的自增主键?

聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的

聚簇索引的顺序和磁盘中数据的存储顺序是一致的,如果主键不是自增id,那么可以想 象,它会干些什么,不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

即避免页分裂,参见 页分裂机制

参考:
《Mysql聚簇索引和非聚簇索引》
《聚簇索引和非聚簇索引:Mysql为什么建议使用自增id做主键》 误区

你可能感兴趣的:(Java,mysql,数据库,推荐自增主键)