主键是一种唯一索引,InnoDB存储引擎是B+Tree优化后实现的,自增主键是为了维持B+Tree的特性且不用频繁的分裂调整。
在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
InnoDB的辅助索引data域存储相应记录主键的值而不是地址。所以不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效。
1、B-Tree
B-Tree,首先定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同数据记录,key是互不相同的;data为数据记录除key外的数据。
结构如下:
2、B+Tree
由B-Tree变种而来,区别:内节点不存储data,只存储key;叶子节点不存储指针。由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。
3、InnoDB存储引擎,在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。这样就提高了区间访问性能。
参考:
mysql B+Tree索引 https://www.cnblogs.com/coshaho/p/7203186.html
MySQL索引实现 https://www.cnblogs.com/coshaho/p/7203214.html