先前讲过了Innodb的行格式以及页格式,以及页保存记录的规矩。你忘记了就回顾看看上篇文章,粉丝才能看哦。
Innodb向页中插入记录时,是按照主键的顺序排序的,记录组成了单向链表。页与页又组成了双向链表,每个页都有页号和记录的主键范围,这样其实就能完成基本的查找要求。
如果我们的每条记录都比较大,平均三条记录就占一个页。那页的链表就会很长,查找就会很慢了。本着追求更快的原则,我们需要从长计议。
1、聚簇索引
我们在页21、10、100里各存了三条,再使用页1保存前面3页的用户最小记录和所处的页号。这种结构使得我们在查找一条记录时,先查找页1,二分法查找页1的槽,然后再遍历组内的数据得到新的页号,再二分法找新的槽,遍历新的组,最后定位到数据。这样的查询方式数据越多越能体现查询优势。
如果此时新增了一条主键为34的数据。页100已经满了,就会申请新的页存放新数据,新的页生成之后也会更新页1,如果页1页满了,同样也会申请新的页进行记录保存。
如此往复,就形成了一棵B+树。所有用户记录处于最下层,成为叶子节点;所有的非叶子节点存放的都是下一层页内记录最小的记录主键与页号。这种B+树还有一个名字叫聚簇索引,也是在建表时自动建立,整个表空间只有一棵聚簇索引,也只有聚簇索引保存着完整的用户记录,其他索引不会保存完整的用户记录。
2、二级索引
从聚簇索引的规则看,只有通过主键查询的时候才能使用B+树,如果查询条件不是主键,那你还是要老老实实的遍历所有叶子节点!于是就需要建立二级索引。
聚簇索引使用主键+页号为规则建立了一颗B+树,那么二级索引就是以我们(需要的列+主键)+页号为规则建立一棵B+树。不同的是,聚簇索引叶子节点保存的是用户的完整记录,二级索引的叶子节点与非叶子节点一样,只保存了索引列和主键列!
通过聚簇索引,我们能直接获取到用户的完整记录,也就是所有列信息。通过二级索引只能索引到一个主键,需要再通过主键到聚簇索引中查询用户完整的记录,这种行为也叫做回表。
二级索引和聚簇索引原理上都是B+树,建立一个索引就是建立一棵B+树。如果你建立的是联合索引,其实也是一棵B+树,索引列有多个,但是多个索引列严格遵守定义时的顺序,索引出的结果可以理解为and而不是or。
二级索引之所以要带有主键,是为了保证B+树节点的唯一性
3、MyISAM的索引方案简单介绍
Innodb聚簇索引在索引的时候就能得到数据,二级索引是先索引出主键,再回表得到数据。
MyISAM则是将索引与真实数据分开存放,通过索引列+行号建立一棵B+树,索引出行号,然后再到另一个地方取出数据。
数据则是根据插入顺序保存起来的,每条数据都有对应的行号。