其他分享
首页 > 其他分享> > 聚集索引和辅助索引

聚集索引和辅助索引

作者:互联网

聚集索引:

在这里插入图片描述

按照每张表的主键构建一棵B+树,叶节点中存放表的整行数据,叶节点成为数据页,每个数据页之间通过一个双向链表进行连接。数据页存放每行的所有记录,非数据页(非叶节点)存放键值和指向数据页的偏移量。一张表只能有一个聚集索引(因为只有一个主键PRIMARY KEY)
(1)可以在叶节点直接找到数据;
(2)对于主键的排序查找速度很快,因为聚集索引是逻辑上连续的。比如查询后10条数据,由于B+树索引是双向链表,可以很快找到随后一个数据页,然后取出最后的10条数据

辅助索引:

按照每张表创建的索引列(非主键列的其他列,被搜索的列)创建一棵B+树,叶子节点并不包含行记录的所有数据,只包含键值和书签,书签用来告诉InnoDB存储引擎在哪里可以找到行数据,一张表可以有可以有多个辅助索引。要先在辅助索引中找到键值,再根据键值去聚集索引中找到整行数据。 例:执行一次查询就是一次IO,比如 辅助索引树高度为3,聚集索引树高度为2,则通过辅助索引查询数据时就要进行3+2次逻辑IO最终得到一个数据页

假如索引完全从磁盘读取,那么经过两次磁盘io便可读出数据,如果不使用索引,则需在磁盘上遍历整个表记录,平均io次数为n/2(n为表记录数)。显而易见,使用索引可以极大加快查询的速度。
select * from course where name="数据结构"利用非主键的其他字段进行查询,创建辅助索引的B+树,

辅助索引的叶子结点的值不是一条记录的完整数据,而是存的记录对应的主键值。在利用非主键的数据段进行查找时,首先通过数据结构在辅助索引中找到主键111,再去聚集索引中根据主键111查找到整行数据。

联合索引
对表上的多个列做索引,依然是一棵B+树,只是键值的数量>=2,
在这里插入图片描述
对于where a=x and b=y使用联合索引;对于where a=x使用联合索引;对于where b=y 不使用联合索引。可以对第二个键值进行排序,例如:查询用户的购物情况,并按照时间顺序排序,联合索引可以避免多一次排序操作。

MyISAM存储引擎的索引
索引文件和数据文件是分离的,索引文件的data域保存记录所在页的物理地址,通过地址来读取页,得到整行数据。而对于二级索引,在 MyISAM存储引擎中以与上图同样的方式实现,也就是主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
在这里插入图片描述

————————————————

参考:https://blog.csdn.net/weixin_42237937/article/details/104473495
参考:https://cloud.tencent.com/developer/article/1557085
参考:MySQL技术内幕

标签:存储,辅助,聚集,索引,整行,数据,主键
来源: https://blog.csdn.net/qq_37857224/article/details/116231328