1. 为什么建议InnoDB表必须建主键
首先,我们知道InnoDB采用B+树作为存储结构,那么必然需要一个列作为key,什么是key?
一个B+树的节点可以存储key、地址、行数据(仅叶子节点),key 就是不重复的值且可以比较(确保树进行分裂时,可以确定是左孩子还是右孩子)。
我们知道主键的特定就是主键的值不可重复,也不可为空
,正好符合B+树key的要求
主键特性参见《主键的概念作用及特点》
聚簇索引默认是主键
,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引
(确切说会选择一个唯一非空的列作为主键)代替。如果没有这样的索引,InnoDB 会隐式定义一个主键
来作为聚簇索引。
InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。
如果你已经设置了主键为聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可
聚簇索引性能最好而且具有唯一性,所以非常珍贵,必须慎重设置。一般要根据这个表最常用的SQL查询方式来进行选择,某个字段作为聚簇索引,或组合聚簇索引,这个要看实际情况
2. 为什么推荐使用整型的自增主键?
聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。
聚簇索引的顺序和磁盘中数据的存储顺序是一致的,如果主键不是自增id,那么可以想 象,它会干些什么,不断地调整数据的物理地址、分页
,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。
即避免页分裂,参见 页分裂机制