SQL 非聚集索引

SQL 非聚集索引

SQL非聚集索引

SQL 非聚集 索引类似于聚集索引。当在列上定义时,它创建一个特殊的表,该表包含索引列的副本以及指向表中实际数据位置的指针。然而,与聚集索引不同,非聚集索引无法对索引列进行物理排序。

以下是SQL非聚集索引的一些关键点:

  • 非聚集索引是数据库中用于加快数据库查询执行时间的一种索引类型。
  • 这些索引所需的存储空间较少,因为它们不存储实际的数据行。
  • 可以在单个表上创建多个非聚集索引。

MySQL没有非聚集索引的概念。在MySQL中,主键(如果存在)和第一个非空唯一键(如果不存在主键)被认为是聚集索引;所有其他索引被称为辅助索引,它们是隐式定义的。

为了更好地理解,看以下插图说明非聚集索引的工作方式:

SQL 非聚集索引

假设我们有一个样本数据库表,有两列分别命名为“ID”和“名称”。如果我们在上述表中的列 ID 上创建一个非聚集索引,它将存储ID列的副本,并指向表中实际数据的特定位置。

语法

以下是在SQL Server中创建 非聚集 索引的语法:

CREATE NONCLUSTERED INDEX index_name ON table_name (column_name)

这里,

  • 索引名称(index_name) :保存非聚集索引的名称。
  • 表名称(table_name) :保存您想要在其中创建非聚集索引的表的名称。
  • 列名称(column_name) :保存您想要在其上定义非聚集索引的列的名称。

示例

让我们使用以下查询创建一个名为 CUSTOMERS 的表-

CREATE TABLE CUSTOMERS(
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE  INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (20, 2),
);

让我们使用以下查询将一些值插入到上面创建的表中:

INSERT INTO CUSTOMERS VALUES
(7, 'Muffy', '24', 'Indore', 5500),
(1, 'Ramesh', '32', 'Ahmedabad', 2000),
(6, 'Komal', '22', 'MP', 9000),
(2, 'Khilan', '25', 'Delhi', 1500),
(4, 'Chaitali', '25', 'Mumbai', 6500),
(5, 'Hardik','27', 'Bhopal', 8500),
(3, 'kaushik', '23', 'Kota', 2000);

表已成功创建在SQL数据库中。

ID NAME AGE ADDRESS SALARY
7 Muffy 24 Indore 5500.00
1 Ramesh 32 Ahmedabad 2000.00
6 Komal 22 MP 9000.00
2 Khilan 25 Delhi 1500.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
3 Kaushik 23 Kota 2500.00

现在,让我们使用以下查询在一个 单列 名为 ID 的表上创建一个非聚集索引。

CREATE NONCLUSTERED INDEX NON_CLU_ID ON customers (ID ASC);

输出

在执行上述查询时,输出如下显示-

Commands Completed Successfully.

验证

让我们使用以下查询检索在CUSTOMERS表上创建的所有索引:

EXEC sys.sp_helpindex @objname = N'CUSTOMERS';

观察下来,我们可以在索引列表中找到名为ID的列。

ID 索引名称 索引描述 索引键
1 NON_CLU_ID 在PRIMARY上的非聚集索引 ID

使用以下查询再次检索CUSTOMERS表,以检查表是否已经排序:

SELECT * FROM CUSTOMERS

正如我们所观察到的,非聚集索引并不会对行进行物理排序,而是从表数据中创建一个单独的键值结构。

ID NAME AGE ADDRESS SALARY
7 Muffy 24 Indore 5500.00
1 Ramesh 32 Ahmedabad 2000.00
6 Komal 22 MP 9000.00
2 Khilan 25 Delhi 1500.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
3 Kaushik 23 Kota 2500.00

在多个列上创建非聚集索引

而不是创建一个新的表,让我们考虑先前创建的CUSTOMERS表。现在,尝试使用以下查询在表的多个列(如ID、AGE和SALARY)上创建一个非聚集索引。

CREATE NONCLUSTERED INDEX NON_CLUSTERED_ID ON CUSTOMERS (ID, AGE, SALARY);

输出

下面的查询将为ID、年龄和薪水分别创建三个单独的非聚集索引。

Commands Completed Successfully.

验证

使用以下查询语句检索在CUSTOMERS表上创建的所有索引-

EXEC sys.sp_helpindex @objname = N'CUSTOMERS';

依照我们的观察,我们可以在索引列表中找到列名为ID、AGE和SALARY的列。

ID index_name index_description index_keys
1 非群集位于 PRIMARY 的 ID 非群集位于 PRIMARY 的 ID ID, AGE, SALARY

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程