SQL 聚集索引
数据库中的 索引 是一种数据结构,它有助于提高从表和视图中检索特定数据的速度。
表中的数据以一种无序的数据结构称为“堆”方式存储,行被放置在没有特定顺序的位置。因此,在从表中检索数据时,查询优化器必须扫描整个表以找到所请求的行。这个过程可能耗费时间,尤其是处理大型表时。为了加速数据检索,SQL提供了一种名为索引的数据对象,它以特定的方式存储和组织表中的数据,从而实现更快的数据访问。
SQL聚集索引
在SQL中, 聚集索引 是一种确定数据值在表中存储顺序的索引类型。
当在特定列上定义聚集索引时,在创建新表时,数据将按照排序的方式插入到该列中。由于数据按照特定顺序存储,所以能够更快地检索数据。
- 建议在表上只有一个聚集索引。如果在同一张表上创建多个聚集索引,那么表将不可能以多个顺序存储相同的数据。
- 当我们尝试在表上创建主键约束时,会自动在表上创建唯一的聚集索引。但是,聚集索引并不等同于主键。主键是对一列或一组列施加唯一性约束,而聚集索引确定数据在表中的物理顺序。
MySQL数据库没有单独的聚集和非聚集索引的规定。在表上定义主键时,会自动创建聚集索引。而在没有定义主键时,第一个非空唯一键将被视为聚集索引。
语法
以下是使用SQL Server创建聚集索引的语法:
其中,
- index_name :指定要创建的索引的名称。
- column_name :指定按指定顺序进行索引的列。
- asc|desc :指定数据应排序的顺序(asc-升序,desc-降序)。默认排序顺序为升序。
示例
在这个例子中,让我们在SQL Server中的一个表上创建一个聚集索引。为此,我们需要先使用以下查询创建一个名为 CUSTOMERS 的表 −
现在,使用以下查询将一些值插入到CUSTOMERS表中:
在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 的列上创建一个聚集索引:
输出
在执行上述查询时,输出结果如下所示:
验证
要验证ID列上是否定义了聚集索引,请检查使用以下查询检索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)上定义聚集索引:
输出
当我们执行以上查询时,输出如下:
验证
现在,让我们验证列中的值 年龄 和 薪水 是否排序:
正如我们在下表中观察到的那样,记录仅根据“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 |