什么是聚集索引和非聚集索引及其两者区别?

一、聚集索引

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

注: 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%。

三、根本区别

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)

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

经验分享 程序员 微信小程序 职场和发展