一、聚集索引
定义:数据行的物理顺序与列值(一般是主键的那一列)的 逻辑顺序相同,一个表中只能拥有一个聚集索引。
注: 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')
备注:这是小编第一次这么认真的去写一篇博客,很多地方都是参考其他博主的文章,取其精华,去其糟粕,如有侵权请及时联系小编