SQL 非聚集索引
SQL非聚集索引
SQL 非聚集 索引类似于聚集索引。当在列上定义时,它创建一个特殊的表,该表包含索引列的副本以及指向表中实际数据位置的指针。然而,与聚集索引不同,非聚集索引无法对索引列进行物理排序。
以下是SQL非聚集索引的一些关键点:
- 非聚集索引是数据库中用于加快数据库查询执行时间的一种索引类型。
- 这些索引所需的存储空间较少,因为它们不存储实际的数据行。
- 可以在单个表上创建多个非聚集索引。
MySQL没有非聚集索引的概念。在MySQL中,主键(如果存在)和第一个非空唯一键(如果不存在主键)被认为是聚集索引;所有其他索引被称为辅助索引,它们是隐式定义的。
为了更好地理解,看以下插图说明非聚集索引的工作方式:
假设我们有一个样本数据库表,有两列分别命名为“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 |