InnoDB索引实现
InnoDB使用B+Tree作为索引结构,数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录如子叶数据文件就可以理解为索引文件,15为key主键,这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
其次,InnoDB的辅助索引data域存储的是主键的值而不是地址。既InnoDB的所有辅助索引都引用主键作为data域。例如,下图子叶中辅助索引Alice的data存的是主键的值
所以当使用辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
设计的思路
在InnoDB的索引实现后大家就可以根据其特性作出相应的设计了,如
- 不使用过长的字段作为主键,因为所有辅助索引都引用了主索引,过长的主索引会令辅助索引变得过大。
- 不使用非唯一的字段作为主键在InnoDB,因为InnoDB数据文件本身是一颗B+Tree,非唯一主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,使用自增字段作为主键则是一个不错的方式。
以上就是如何设计InnoDB主键索引的方式,思路是设计先要去理解其原理,在理解其原理之后根据其特性结合实际场景业务等即可以做出对应合理设计,希望偶的回答对你有所帮助。