MySQL的InnoDB存储引擎为什么要用自增的主键?

主键是一种唯一索引,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

 

posted @ 2019-08-30 15:05  xyfaneast  阅读(1376)  评论(0编辑  收藏  举报