SQL 聚集索引
数据库中的 索引 是一种数据结构,它有助于提高从表和视图中检索特定数据的速度。
表中的数据以一种无序的数据结构称为“堆”方式存储,行被放置在没有特定顺序的位置。因此,在从表中检索数据时,查询优化器必须扫描整个表以找到所请求的行。这个过程可能耗费时间,尤其是处理大型表时。为了加速数据检索,SQL提供了一种名为索引的数据对象,它以特定的方式存储和组织表中的数据,从而实现更快的数据访问。
SQL聚集索引
在SQL中, 聚集索引 是一种确定数据值在表中存储顺序的索引类型。
当在特定列上定义聚集索引时,在创建新表时,数据将按照排序的方式插入到该列中。由于数据按照特定顺序存储,所以能够更快地检索数据。
- 建议在表上只有一个聚集索引。如果在同一张表上创建多个聚集索引,那么表将不可能以多个顺序存储相同的数据。
- 当我们尝试在表上创建主键约束时,会自动在表上创建唯一的聚集索引。但是,聚集索引并不等同于主键。主键是对一列或一组列施加唯一性约束,而聚集索引确定数据在表中的物理顺序。
MySQL数据库没有单独的聚集和非聚集索引的规定。在表上定义主键时,会自动创建聚集索引。而在没有定义主键时,第一个非空唯一键将被视为聚集索引。
语法
以下是使用SQL Server创建聚集索引的语法:
CREATE INDEX index_name ON table_name(column_name [asc|desc])
其中,
- index_name :指定要创建的索引的名称。
- column_name :指定按指定顺序进行索引的列。
- asc|desc :指定数据应排序的顺序(asc-升序,desc-降序)。默认排序顺序为升序。
示例
在这个例子中,让我们在SQL Server中的一个表上创建一个聚集索引。为此,我们需要先使用以下查询创建一个名为 CUSTOMERS 的表 −
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (20, 2)
);
现在,使用以下查询将一些值插入到CUSTOMERS表中:
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 Server数据库中成功创建了表。
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 CLUSTERED INDEX CLU_ID ON CUSTOMERS(ID ASC);
输出
在执行上述查询时,输出结果如下所示:
Commands Completed Successfully.
验证
要验证ID列上是否定义了聚集索引,请检查使用以下查询检索CUSTOMERS表记录时是否对其进行了排序 –
SELECT * FROM CUSTOMERS;
表格的记录已根据ID列中的值按升序排列。
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2500.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | MP | 9000.00 |
7 | Muffy | 24 | Indore | 5500.00 |
在多个列上创建聚集索引
通过以下示例,让我们了解当在表的多个列上创建聚集索引时,它是如何工作的。
与其创建新表,我们考虑之前创建的CUSTOMERS表,并使用以下查询在该表的多个列(如AGE和SALARY)上定义聚集索引:
CREATE CLUSTERED INDEX MUL_CLUS_ID ON CUSTOMERS (AGE, SALARY ASC);
输出
当我们执行以上查询时,输出如下:
Commands Completed Successfully.
验证
现在,让我们验证列中的值 年龄 和 薪水 是否排序:
SELECT * FROM CUSTOMERS;
正如我们在下表中观察到的那样,记录仅根据“AGE”列中的值进行排序,而不考虑“SALARY”列中的值。因此,建议在表上只有一个聚集索引。
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
6 | Komal | 22 | MP | 9000.00 |
3 | Kaushik | 23 | Kota | 2500.00 |
7 | Muffy | 24 | Indore | 5500.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
1 | Ramesh | 32 | Ahmedabad | 2000.00 |