辅助索引【非聚集索引】
叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点还包含了一个书签。该书签用来告诉Innodb 存储引擎哪里可以找到对应的行的数据,由于InnnoDB存储引擎表是索引组织表,因此InnnoDB存储引擎的辅助索引的辅助书签就是相应的行数据的聚集索引键。
辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上都可以有多个辅助索引。
当通过辅助索引来找数据时,Innodb的存储引擎会遍历辅助索引并通过叶级别的指针获取指向索引的主键,然后通过主键索引获得某一行的记录。
举列来说,如果在以高度为3的辅助索引中来查找数据,那么需要对这棵树遍历3次找到主键,如果聚集索引同样高度为3,那么还需要对聚集索引进行3次查找,最终找到数据。一共是6次IO
对于其它表比如SQL server,其中一种称为堆表的类型,即行数据存储是顺序存放的。这与mysql 数据库MYISAM 存储引擎有些类似。对表的特性决定了对标上的索引都是非聚集的,主键与非主键的区别是否非空(not bull)因此书签是个标识符 可以用如“文件号、页号、槽号”
B+树索引的分裂
B+ 树索引也的分裂并不是从页中间记录开始的,这样可能会导致空间的浪费。
1、2、3、4、5、6、7、8、9
插入是根据自增顺序进行的 如果10条记录后需要分裂操作就得到2个页
p1 1、2、3、4
p2 5、6、7、8、9、10
然而插入是顺序的p1 这个也不会记录被插入,从而导致空间浪费,而p2会再次分裂。
InnoDB 存储引起page Header 中有几部分用来保存插入的信息,通过这个来决定左右分裂,同时决定分裂哪一个。插入随机的,则去也中间的记录作为分裂点的记录。 往同一方向插入的记录数为5,并且定位到的记录(Innodb 存储引擎插入时,首先需要定位,定位到记录为待插入前一条记录)之后还有3条记录,则分裂点定位到后的第三条记录,否则分裂点就是待插入数据。