【SQL SERVER】索引

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

【SQL SERVER】索引

在做开发过程中经常会接触数据库索引,不只是DBA才需要知道索引知识,了解索引可以让我们写出更高质量代码。

索引概述
聚集索引
非聚集索引
唯一索引
筛选索引
非聚集索引包含列
索引概述

       索引的存在主要为了提高数据检索速度,设计高效的索引对于获得良好的数据库和应用程序性能极为重要。

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像平常我们用的新华字典的目录,假如新华字典没有目录有找一个字就必须从第一页一直翻到最后一页,这是多么令人绝望的事情。

索引是占有而外空间,是一种典型的空间换时间的做法,所以对待索引必须要保持敬畏之心,要建立在经常筛选的条件上,查询数据要时刻想着利用索引,竟然都花额外空间存储索引,不能让它白白浪费掉。

聚集索引

聚集索引基于数据行的键值在表内排序和存储这些数据行。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

简单来说就是聚集索引和数据的存放顺序是一致的,聚集索引叶节点就是数据。

创建准则

1. 定义聚集索引键时使用的列越少越好

2. 唯一或包含许多不重复的值(若创建聚集索引时没使用唯一属性,SQL Server会自动添加一个4字节的唯一标识列)

  1. 经常需要顺序访问数据

4. 经常用于对表中检索到的数据进行排序

5. 列大小不超过900字节

适合使用聚集索引情况

  1. 使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值
  2. 返回大型结果集

3. 使用 JOIN 子句;一般情况下,使用该子句的是外键列

4. 使用 ORDER BY 或 GROUP BY 排序/分组数据(因为分组数据也是要先排序)

不适合使用聚集索引情况

1. 频繁更改的列,每次更改都会导致索引页不断重新构建。

2. 若干列或若干大型列的组合,每次构建排序需要大量计算

TSQL创建聚集索引

--唯一的聚集索引
CREATE UNIQUE CLUSTERED INDEX [IX_TableName_Name] ON [dbo].TableName

--不唯一的聚集索引
CREATE CLUSTERED INDEX [IX_TableName_Name] ON [dbo].TableName

非聚集索引

非聚集索引包含索引键值和指向表数据存储位置的行定位器。 可以对表或索引视图创建多个非聚集索引。 通常,设计非聚集索引是为改善经常使用的、没有建立聚集索引的查询的性能。

简单来说不是聚集索引的就是非聚集索引。额,好像没解释一样。。。非聚集索引的叶节点是定位器。

创建准则

1. 不超过1700字节(其他文档说是900字节,我测试SQL Server是1700字节)

2. 避免添加不必要的列,因为增加索引维护成本

3. 包含许多不重复的值,这样才能更好利用索引查询效率

  1. 列的长度尽可能小

适合使用非聚集索引情况

1. 使用 JOIN 或 GROUP BY 子句

2. 不返回大型结果集的查询

3. 经常包含在查询的搜索条件中的列

不适合使用非聚集索引情况

  1. 列的重复值较少
  2. 不是经常查询的搜索条件的列
  3. 列的长度过长,因为增加索引维护成本

聚集索引与非聚集索引区别(知识有限,未必全,希望补充)

  1. 聚集索引是按物理顺序排列,非聚集索引逻辑顺序排列
  2. 聚集索引一个表只能有一个,非聚集索引可以多个
  3. 聚集索引的叶节点是数据,非聚集索引的叶节点是定位器
  4. 聚集索引不能附加信息,非聚集索引可以包含附加信息

TSQL创建非聚集索引

CREATE INDEX IX_TableName_FieldName ON DataTable(FieldName DESC)

唯一索引

唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性。 只有当唯一性是数据本身的特征时,指定唯一索引才有意义。

保证索引键中不包含重复的值(包含NULL值)

创建准则

1. 只有需要保证数据唯一性的情况下才使用

适合使用唯一索引情况

1. 需要保证数据唯一性

不适合使用唯一索引情况 

  1. 不需要保证数据唯一性

TSQL创建唯一索引

CREATE UNIQUE INDEX IX_TableName_FieldName ON DataTable(FieldName ASC)

筛选索引

 筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。 筛选索引使用筛选谓词对表中的部分行进行索引。

只把符合条件的数据做索引,相当于在一个表的子集做索引。从而达到下面几个好处

  1. 提高了查询性能 ,因为索引页的数据比全表索引小
  2. 减少索引维护开销,因为只有符合条件才会对索引页维护
  3. 减少索引存储开销,道理跟上面一样

创建准则

  1. 筛选的条件必须是明确的值
  2. 通常来说经常查询出现的条件跟过滤条件符合
  3. 经常检索的都是数据的子集

适合使用筛选索引情况

1. 经常筛选表的子集数据,例如通常我们只查询有效的订单,无效的订单很少查,或者基本不查,这种情况适合建立筛选索引

  1. 只查最近数据,例如记录只查最近一个月,可以通过定期在数据库空闲的时重新维护筛选索引达到加快查询效率

不适合使用筛选索引情况

1. 经常查询条件包含筛选值外,这样导致走全表扫描(前提没其他索引覆盖到)

  1. 查询条件不固定

TSQL创建唯一索引

CREATE INDEX IX_TableName_FieldName ON [dbo].TableName where State > 1

非聚集索引包含列

 通过将非键列添加到非聚集索引的叶级,扩展非聚集索引的功能。 通过包含非键列,可以创建覆盖更多查询的非聚集索引

通过把包含的列同时维护在索引页,达到当查询的数据都包含在索引中的数据的时候,因为在索引页找到所有数据,就不需要访问表的数据页,从而减少I/O操作,这种通常称为“覆盖查询”

创建准则

  1. 必须至少定义一个键列
  2. 在 CREATE INDEX 语句的 INCLUDE 子句中定义非键列
  3. 只能对表或索引视图的非聚集索引定义非键列
  4. 允许除 text、 ntext和 image之外的所有数据类型
  5. 精确或不精确的确定性计算列都可以是包含列
  6. 不能同时在 INCLUDE 列表和键列列表中指定列名
  7. INCLUDE 列表中的列名不能重复
  8. 索引键列(不包括非键)必须遵守现有索引大小的限制
  9. 所有非键列的总大小只受 INCLUDE 子句中所指定列的大小限制;例如, varchar(max) 列限制为 2 GB

适合使用非聚集索引包含列

1. 筛选的列是索引键 && 查询的列都是包含的列

不适合使用非聚集索引包含列

2. 筛选的列不是索引键  ||  查询的列有不在包含列中的

TSQL创建筛选索引

CREATE INDEX IX_TableName_FieldName ON DataTable(Field1 ASC) INCLUDE(Field2)
转发请标明出处: https://www.cnblogs.com/WilsonPan/p/12625364.html

参考文章

SQL Server 索引体系结构和设计指南 - SQL Server | Microsoft Docs

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
15天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 存储 数据库
sql事务、视图和索引
sql事务、视图和索引
14 0
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
1月前
|
SQL 存储 弹性计算
GaussDB SQL调优:建立合适的索引
GaussDB SQL调优:建立合适的索引
12 0
|
1月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
178 0
|
24天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
15天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
2天前
|
SQL 数据管理 关系型数据库
如何在 Windows 上安装 SQL Server,保姆级教程来了!
在Windows上安装SQL Server的详细步骤包括:从官方下载安装程序(如Developer版),选择自定义安装,指定安装位置(非C盘),接受许可条款,选中Microsoft更新,忽略警告,取消“适用于SQL Server的Azure”选项,仅勾选必要功能(不包括Analysis Services)并更改实例目录至非C盘,选择默认实例和Windows身份验证模式,添加当前用户,最后点击安装并等待完成。安装成功后关闭窗口。后续文章将介绍SSMS的安装。
5 0
|
10天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
22 0
|
15天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例