博客链接:Cs XJH’s Blog
聚集索引
聚集索引就是按照每张表的主键id和指向叶子结点的偏移量作为B+树的非叶子结点,行记录数据作为叶子结点,叶子结点也称之为数据页,且叶子结点通过双向链表连接。
由于一张数据表只有一个主键,因此一张数据表也只能有一个聚集索引。
聚集索引结构是B+树且叶子结点通过双向链表连接,所以对于主键的排序查找和范围查找都非常快。
辅助索引
辅助索引,也称之为非聚集索引,一张表可以有多个。
辅助索引也是B+树结构,其非叶子结点包含建立索引列的值,而其叶子结点包含建立索引列的值和书签,书签告诉InnoDB引擎哪里可以找到与索引对应的行数据,也就是相应的聚集索引键。同样,叶子结点通过双向链表连接。
覆盖索引
一个辅助索引包含了查询结果的数据就叫做覆盖索引,即从辅助索引中就可以得到查询结果,而不需要从聚集索引中查询。
覆盖索引的好处
- 减少IO操作
当查询某字段时,需要先查询辅助索引,再查询聚集索引。如果在辅助索引中就找到查询结果,就不需要查询聚集索引,这样明显减少IO操作。而且辅助索引的叶子结点不包含行记录的所有数据,也可以减少IO操作。 - 有利于统计
对于select count(*) from users
这个查询表记录数的sql,通过遍历聚集索引和辅助索引都可以得到结果,但优化器会选择辅助索引,因为辅助索引需要的IO操作少于聚集索引。
联合索引
为多列字段建立一个索引,称之为联合索引。
联合索引需要遵从最左前缀原则。说白了就是,数据库根据你对多个字段建立索引的顺序,从左到右依次进行排序。如果最左字段没有在查询条件中使用,则不会使用该联合索引。
联合索引内部结构如图: