聚集索引 VS 非聚集索引(B+树)
超级详细讲解【字节跳动大佬】(MySQL索引-B+树(看完你就明白了) - 苍青浪 - 博客园 (cnblogs.com))
在上节介绍 B+ 树索引的时候,我们提到了图中的索引其实是聚集索引的实现方式。
那什么是聚集索引呢?在 MySQL 中,B+ 树索引按照存储方式的不同分为聚集索引和非聚集索引。
这里我们着重介绍 InnoDB 中的聚集索引和非聚集索引:
①聚集索引(聚簇索引):以 InnoDB 作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。
这是因为 InnoDB 是把数据存放在 B+ 树中的,而 B+ 树的键值就是主键,在 B+ 树的叶子节点中,存储了表中所有的数据。
这种以主键作为 B+ 树索引的键值而构建的 B+ 树索引,我们称之为聚集索引。
②****非聚集索引(非聚簇索引):以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。
非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。
明白了聚集索引和非聚集索引的定义,我们应该明白这样一句话:数据即索引,索引即数据。
非聚集索引的二次查询问题
非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。
在SQL Server里面查询效率如下所示,Index Seek就是索引所花费的时间,Key Lookup就是二次查询所花费的时间。可以看的出二次查询所花费的查询开销占比很大,达到50%。
在SQL Server里面会对查询自动优化,选择适合的索引,因此如果在数据量不大的情况下,SQL Server很有可能不会使用非聚集索引进行查询,而是使用聚集索引进行查询,即便需要扫描整个聚集索引,效率也比使用非聚集索引效率要高。
辅助索引:
如果是单列索引,那么索引记录里面就2个值,一个是索引列值,一个是索引列值对应的主键值。如果是三列索引,那么索引记录里面就4个值,前三个是索引列的值,而且索引列的顺序与索引声明的顺序一致,另外一个是索引列值对应的主键值。
解析详情(图文):https://www.cnblogs.com/aspwebchh/p/6652855.html
各类索引的使用场景 复合索引的优点和注意事项 - 大西瓜3721 - 博客园 (cnblogs.com)
标签:二次,聚集,查询,索引,键值,数据,主键 From: https://www.cnblogs.com/kkbk/p/17701921.html