mysql笔记六:B+树索引

关键字:聚簇索引、辅助索引、联合索引、回表操作、覆盖索引

6.1、聚簇索引

在表创建的时候,InnoDB就会为我们自动创建一个聚簇索引,InnoDB所有的用户数据都存在这个聚簇索引构成的B+树的叶子节点上,所以对于聚簇索引来说,索引就是数据,数据就是索引。数据和索引存在一起。

存放用户数据的数据页在聚簇索引形成的B+树的叶子节点上,索引目录存放在B+树的非叶子节点(也叫内节点)上。

对于聚簇索引来说,在每个数据页中的数据是按照数据主键值的大小进行排序的。在叶子节点所有数据页构成了一个双向链表(通过File Header的FIL_PAGE_PREV和FIL_PAGE_NEXT字段完成的),后一个页面的数据要比前一个页面要大。在非叶子节点中也是如此。

mysql笔记六:B+树索引_第1张图片

6.2、二级索引

与聚簇索引不同,二级索引的叶子节点不会存储用户数据中的所有的列数据,只会存储二级索引列和主键列的数据,所以通过二级索引查找到的用户数据不是完整的记录,如果需要查找完整的记录,则需要拿查找到的数据的主键值,去聚簇索引中查找完整数据,这个操作称为回表。查询一次完整的数据需要用到2棵B+树,所以这种索引称为二级索引,也叫辅助索引。

二级索引中,每个数据页中的数据是根据这个二级索引的索引列大小进行排序的。

二级索引的叶子节点不存储所有列的数据是因为太占磁盘空间。

6.3、联合索引

联合索引是二级索引的一种,他的索引列是由多列构成。排序时先按某列排序,大小一样时,按其他列依次排序。

6.4、覆盖索引

在使用二级索引查找完整的数据的时候,会发生回表的操作。所以使用二级索引查找完成数据会涉及到2棵B+树,分别是二级索引B+树和聚簇索引B+树,访问二级索引B+树使用的是顺序IO,查出来的数据在二级索引B+树的叶子节点上是顺序连续的,访问聚簇索引使用的是随机IO,因为查出来的数据在聚簇索引B+树上并不是连续的,需要一条一条的查找,比较耗时。

所以,当我们使用二级索引查找数据的时候,如果查询列表的列不在二级索引上,那么究竟是采用二级索引+回表的方式查找,还是使用全表扫描,mysql需要根据统计数据,计算两种方式的查询成本,选择查询成本低的查询方式。

如果我们想保证一定使用二级索引,那么我们在查询列表上最好就是索引的字段,这种查询肯定使用的是二级索引+不回表的方式。这种查询方式称为覆盖索引。

6.5、注意事项

(1)不管是聚簇索引还是二级索引,在B+树上并不能找到某条要查找的数据的所在行。只能查找到这条数据所在的页。然后数据库需要把该页加载到内存中,使用页的Page Directory通过二分法找到这条数据在页中的分组,然后在遍历分组,找到这条记录。

(2)索引的根节点从创建索引开始,就一直不会变,通过索引查找数据都要从这个根节点开始查,这个根节点的信息会单独保存起来,保存在InnoDB数据字典的sys_indexes表中。

(3)不管是聚簇索引还是二级索引,非叶子节点的目录项记录除了目录页之外的其他字段组成的数据要保证唯一性。

(4)一个页面至少存储2条数据,否则索引建立没有意义。

你可能感兴趣的:(mysql)