聚集索引和非聚集索引

参考文章:
https://www.jianshu.com/p/5681ebd5b0ef
https://www.cnblogs.com/weixing/p/4317774.html
https://www.cnblogs.com/s-b-b/p/8334593.html

一.索引简介

众所周知,索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,SQL的主流索引结构有B+树以及Hash结构,聚集索引以及非聚集索引用的是B+树索引。

SQL Sever索引类型有:唯一索引,主键索引,聚集索引,非聚集索引。

MySQL 索引类型有:唯一索引,主键(聚集)索引,非聚集索引,全文索引。

二.聚集索引

聚集(clustered)索引,也叫聚簇索引。

定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同一个表中只能拥有一个聚集索引。 由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引

单单从定义来看是不是显得有点抽象,打个比方,一个表就像是我们以前用的新华字典,聚集索引就像是拼音目录,而每个字存放的页码就是我们的数据物理地址,我们如果要查询一个“哇”字,我们只需要查询“哇”字对应在新华字典拼音目录对应的页码,就可以查询到对应的“哇”字所在的位置,而拼音目录对应的A-Z的字顺序,和新华字典实际存储的字的顺序A-Z也是一样的,如果我们中文新出了一个字,拼音开头第一个是B,那么他插入的时候也要按照拼音目录顺序插入到A字的后面。

三.非聚集索引

非聚集(unclustered)索引。

定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。

聚集索引和非聚集索引的区别

  • 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
  • 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。

聚集索引表记录的排列顺序与索引的排列顺序一致

  • 优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。
  • 缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排, 降低了执行速度。

建议使用聚集索引的场合为:
a. 此列包含有限数目的不同值;
b. 查询的结果返回一个区间的值;
c. 查询的结果返回某值相同的大量结果集。

非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致

聚集索引和非聚集索引都采用了B+(平衡树)树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。
非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。
建议使用非聚集索引的场合为:
a. 此列包含了大量数目不同的值;
b. 查询的结束返回的是少量的结果集;
c. order by 子句中使用了该列。

表中经常有一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键.(默认为聚集索引)

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。
如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。

聚集索引相当于我们书本上前面的目录的一样,它可以方便快速的找到你想找的内容,而非聚集索引就相当于书最后几页的解释,它是对书中某个语句或者是生词的解释,就像我们上学时候的地理说一样,书后面都有各种地理名称的英文解释;
《数据库原理》里面的解释:聚集索引的顺序就是数据的物理存储顺序,而非聚集索引的顺序和数据物理排列无关。因为数据在物理存放时只能有一种排列方式,所以一个表只能有一个聚集索引。在SQL SERVER中,索引是通过二叉树的数据结构来描述的;我们可以如此理解这个两种索引:聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点,只不过其包含一个指向对应数据块的指针。
聚集索引会降低 insert,和update操作的性能,所以,是否使用聚集索引要全面衡量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值