详细分析Sql Server索引的创建、查询、删除等基本知识(附Demo)

前言

原先分析过Sql的基本知识,感兴趣也可阅读:

  1. Mysql的两种存储引擎详细分析及区别(全)
  2. Mysql优化高级篇(全)

1. 基本知识

索引是在数据库表上创建的数据结构,用于提高查询效率

SQL Server 支持几种类型的索引,主要包括:

  • 聚集索引(Clustered Index):数据表的实际数据按照索引顺序排列
    一个表只能有一个聚集索引,因为数据行的存储顺序只能有一种
    通常在主键列上创建
  • 非聚集索引(Non-Clustered Index):创建一个单独的索引结构,指向表中的数据行
    可以有多个非聚集索引

索引的主要作用是加速查询速度,但过多的索引可能会影响数据的插入、更新和删除操作的性能

2. 索引

2.1 创建

创建索引可以使用 CREATE INDEX 语句

以下是基于 [manong].[dbo].[yanjiuseng] 表的示例:

创建聚集索引(假设以 id 列为主键):

CREATE CLUSTERED INDEX IX_yanjiuseng_id
ON [manong].[dbo].[yanjiuseng] (id);

创建非聚集索引(假设以 name 列为索引):

CREATE NONCLUSTERED INDEX IX_yanjiuseng_name
ON [manong].[dbo].[yanjiuseng] (name);

创建复合索引(假设在 name 和 age 列上创建):

CREATE NONCLUSTERED INDEX IX_yanjiuseng_name_age
ON [manong].[dbo].[yanjiuseng] (name, age);

2.2 删除

删除索引可以使用 DROP INDEX 语句:

删除非聚集索引:

DROP INDEX [manong].[dbo].[yanjiuseng].IX_yanjiuseng_name;

删除聚集索引(聚集索引通常在删除表时会自动删除,无需单独删除,但可以通过以下语句删除):

DROP INDEX [manong].[dbo].[yanjiuseng].IX_yanjiuseng_id;

2.3 查询

单独查询表的索引信息:EXEC sp_helpindex '[manong].[dbo].[yanjiuseng]';

在这里插入图片描述

从表中也可得知为非聚集联合索引

如果想要查询是什么索引以及排的位置,可以使用如下方式:

SELECT 
    i.name AS IndexName,
    i.type_desc AS IndexType,
    ic.column_id AS ColumnID,
    c.name AS ColumnName
FROM 
    sys.indexes i
INNER JOIN 
    sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE 
    i.object_id = OBJECT_ID('[manong].[dbo].[yanjiuseng]');

截图如下:

在这里插入图片描述

查询指定索引所包含的列也可知道为联合索引

SELECT 
    i.name AS IndexName,
    c.name AS ColumnName,
    ic.index_column_id AS ColumnID
FROM 
    sys.indexes i
INNER JOIN 
    sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE 
    i.object_id = OBJECT_ID('[manong].[dbo].[yanjiuseng]')
    AND i.name = 'END_TIME_INDEX'
ORDER BY 
    ic.index_column_id;

如果结果返回一个列,则为单列索引

IndexName       | ColumnName | ColumnID
----------------|------------|----------
END_TIME_INDEX  | endTime    | 1

如果结果返回多个列,则为复合索引

IndexName       | ColumnName | ColumnID
----------------|------------|----------
END_TIME_INDEX  | endTime    | 1
END_TIME_INDEX  | status     | 2

再次展示另外一个表的聚集联合索引

在这里插入图片描述

3. 总结

  • 索引的选择:选择适合的索引类型和列是关键
    频繁用于查询的列应建立索引,而频繁更新的列应谨慎建立索引
  • 索引的维护:索引可能会随数据的增加而变得不再高效,定期对索引进行重建或重组可以保持其性能
  • 性能考量:虽然索引提高了查询性能,但它们也会增加存储空间需求和数据操作的开销
    过多的索引会导致性能下降,因此应根据实际需求选择合适的索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值