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

📅  最后修改于: 2021-09-09 11:54:59             🧑  作者: Mango

先决条件 – 聚集和非聚集索引上的 SQL 查询

1. 聚集索引:
仅当以下两个条件都满足时才会创建聚集索引 –

  1. 您移动到辅助存储器中的数据或文件应该按顺序或排序顺序排列。
  2. 应该有非键值,这意味着它可以有重复的值。

每当您在表中应用聚集索引时,它只会在该表中执行排序。您可以像主键一样在表中只创建一个聚集索引。聚集索引与字典一样,按字母顺序排列数据。

在聚集索引中,索引包含指向块但不包含直接数据的指针。

聚集索引示例 –
如果您将主键应用于任何列,那么它将自动成为聚集索引。

create table Student
( Roll_No int primary key, 
Name varchar(50), 
Gender varchar(30), 
Mob_No bigint );

insert into Student
values (4, 'ankita', 'female', 9876543210 );

insert into Student 
values (3, 'anita', 'female', 9675432890 );

insert into Student 
values (5, 'mahima', 'female', 8976453201 ); 

在这个例子中,Roll no 是一个主键,它会自动充当一个聚集索引。
此代码的输出将按卷号的递增顺序产生。

Roll_No Name Gender Mob_No
3 anita female 9675432890
4 ankita female 9876543210
5 mahima female 8976453201

一张表只能有一个聚簇索引,但多列可以有一个聚簇索引,这种类型的索引称为复合索引。

2. 非聚集索引:
非聚集索引类似于一本书的索引。一本书的索引由章节名称和页码组成,如果您想阅读任何主题或章节,则可以使用该书的索引直接转到该页面。无需翻阅一本书的每一页。

数据存放在一处,索引存放在另一处。既然,数据和非聚集索引是分开存储的,那么一个表中可以有多个非聚集索引。

在非聚集索引中,索引包含指向数据的指针。

非聚集索引示例 –

create table Student
( Roll_No int primary key, 
Name varchar(50), 
Gender varchar(30), 
Mob_No bigint );

insert into Student 
values (4, 'afzal', 'male', 9876543210 );

insert into Student 
values (3, 'sudhir', 'male', 9675432890 );

insert into Student 
values (5, 'zoya', 'female', 8976453201 );

create nonclustered index NIX_FTE_Name
on Student (Name ASC); 

这里,roll no 是主键,因此自动有一个聚集索引。
如果我们想在 NAME 列中应用非聚集索引(按升序),那么将为该列创建新表。

应用非聚集索引前的输出:

Roll_No Name Gender Mob_No
3 sudhir male 9675432890
4 afzal male 9876543210
5 zoya female 8976453201

应用非聚集索引后的输出:

Name Row address
Afzal 3452
Sudhir 5643
zoya 9876

使用行地址是因为,如果有人要搜索数据中的 sudhir,那么通过使用行地址,他/她将直接转到该行地址并可以直接获取数据。

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

CLUSTERED INDEX NON-CLUSTERED INDEX
Clustered index is faster. Non-clustered index is slower.
Clustered index requires less memory for operations. Non-Clustered index requires more memory for operations.
In clustered index, index is the main data. In Non-Clustered index, index is the copy of data.
A table can have only one clustered index. A table can have multiple non-clustered index.
Clustered index has inherent ability of storing data on the disk. Non-Clustered index does not have inherent ability of storing data on the disk.
Clustered index store pointers to block not data. Non-Clustered index store both value and a pointer to actual row that holds data.
In Clustered index leaf nodes are actual data itself. In Non-Clustered index leaf nodes are not the actual data itself rather they only contains included columns.
In Clustered index, Clustered key defines order of data within table. In Non-Clustered index, index key defines order of data within index.
A Clustered index is a type of index in which table records are physically reordered to match the index. A Non-Clustered index is a special type of index in which logical order of index does not match physical stored order of the rows on disk.