聚集索引和非聚集索引的相关说明

1、聚集索引

定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。通俗的来说是指数据表中每一条数据的相对顺序和他们在硬盘中存储的相对顺序是相同的。如下图所示。
在这里插入图片描述
上图中的地址一栏表示数据存储的硬盘单元。id是数据表的主键,可以将其设置为聚集索引。
数据库中的innoDB存储引擎采用的存储结构是B+树。这里可以补充一点,之所以存储结构采用B+树是因为数据库中的数据是存储在硬盘中的,要想访问数据库中的数据需要将硬盘中的数据调到内存中,如果存储结构采用平衡二叉树或者二叉搜索树这样的结构,最多访问磁盘的次数就是树的高度,因此如果数据量非常大的话,树的高度非常的高,这就导致访问磁盘的次数会很多,严重影响数据库查找效率,而采用B+树的存储结构就不一样,在innoDB中,B+树的非叶子节点都是索引表,只有叶子节点才是真正的数据,并且B+树的叶子节点都是用链表连接的。一般B+树的一个节点都会保存一个磁盘块大小的数据量,因此每次访问B+树的时候都会将一个磁盘块的数据调入内存,这样就把访问磁盘的次数降低了,效率变高。因此innoDB的聚集索引的结构可以用下图来表示。
在这里插入图片描述
上图中的蓝色部分就是B+树的叶子节点,保存真实的数据,红色部分是非叶子节点,保存的是指向真实数据的指针,即非叶子节点是索引表。上图中的聚集索引是人名。
在这里插入图片描述
上图中聚集索引是用主键id,数据类型是int类型。搜索的过程是从根节点开始,如果id大于等于15且小于56,那么会将最左边的子树对应的磁盘块加载到内存中。如果id大于等于15且小于20,那么便会将最左边的子树加载到内存中,进而查找想要的数据。

2、非聚集索引

定义:数据表中数据行的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
非聚集索引的说明图如下所示。
在这里插入图片描述
从上图中可以看出非聚集索引也是采用的是B+树的结构,不过和聚集索引不一样的地方在于,非聚集索引的叶子节点依然是一个索引表,指向硬盘中的真实数据。
在这里插入图片描述
上图中的非聚集索引是用人名来作为检索依据,叶子节点保存的是人名对应的主键id。这种结构的非聚集索引是innoDB中的非聚集索引,用来辅助聚集索引进行信息检索的。
如果编写如下sql语句。

select username from table where username='Eric'

上图的sql语句会按照人名进行检索,由于人名是非聚集索引,因此找到【Eric】对应的主键id之后,再根据id进行聚集索引的检索,从而找到对应的数据块,这也是非聚集索引的二次查找。因此innoDB中的非聚集索引是辅助聚集索引的。
而myisam存储引擎中的非聚集索引稍有不同,可以用下图的B+树来表示。
在这里插入图片描述
上图中myisam的非聚集索引的叶子节点存储的是数据行的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值