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

   日期:2020-09-16     浏览:93    评论:0    
核心提示:聚集(clustered)索引,也叫聚簇索引 定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。 注:第一列的地址表示该行数据在磁盘中的物理地址,后面三列才是我们SQL里面用的表里的列,其中id是主键,建立了聚集索...

一、聚集索引

定义:数据行的物理顺序与列值(一般是主键的那一列)的 逻辑顺序相同,一个表中只能拥有一个聚集索引。

: 1、由于物理排列方式与聚集索引的顺序相同,所以也就只能建立一个聚集索引了。

        2、从下图可以看出聚集索引的好处了,索引的 叶子节点就是对应的数据节点,可以直接获取到对应的全部列的数据,而非聚集索引在索引没有覆盖到对应的列的时候需要进行二次查询,后面会详细讲。因此在查询方面聚集索引的速度往往会更占优势。

        3、如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。

        4、SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,而MySQL里主键就是聚集索引

 

二、非聚集索引

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

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

        2、非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

        3、使用以下语句进行查询,不需要进行二次查询,直接就可以从非聚集索引的节点里面就可以获取到查询列的数据。

select id, username from t1 where username = '小明' 
select username from t1 where username = '小明'

        4、但是使用以下语句进行查询,就需要二次的查询去获取原数据行的score:

select username, score from t1 where username = '小明'

        5、可以看的出二次查询所花费的查询开销占比很大,达到50%。

        6、聚集索引与非聚集索引区别原理图如下(如果有看不懂可以在评论区留言)

三、根本区别

1、区别:数据行的物理顺序与表的某个列值的逻辑顺序是否一致。

2、使用示例证明:

第一步:创建表和插入相关测试数据

create database IndexDemo 
go 
use IndexDemo 
go 
create table ABC 
( 
A int not null, 
B char(10), 
C varchar(10) 
) 
go 
insert into ABC select 1,'B','C' 
union select 5,'B','C' 
union select 7,'B','C' 
union select 9,'B','C' 
go select * from abc

第二步:插入一条数据

insert into abc values('6','B','C')

第三步:创建聚集索引(注意:排列变成有序

create clustered index CLU_ABC on abc(A) 

第四步:删除聚集索引(注意:排列变成无序

drop index abc.CLU_ABC

第五步:非聚集索引,添加新的记录,查看表顺序,如图四,并没有影响表的顺序

create nonclustered index NONCLU_ABC on abc(A)
insert into abc values('4','B','C') 

备注:这是小编第一次这么认真的去写一篇博客,很多地方都是参考其他博主的文章,取其精华,去其糟粕,如有侵权请及时联系小编

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服