问题描述:
每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录,如果主键不是id单调递增的,有可能会出现页频繁分裂,主键重复、顺序凌乱的问题,那么二分搜索时就做不到准确定位,(主索引是指在指定的索引字段活表达式中不允许出现重复值的索引)那么在这种情况下,主索引就会产生分裂。
产生原因:
MySQL的索引中的 InnoDB中的索引,表都是根据主键顺序以索引的形式存放的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
根据非主键索引查询到主键,再根据主键找到记录的过程我们称为回表;基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。
在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,在走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。