索引是一种特殊的查询表,是将结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,这部分信息称为索引。索引帮助数据库高效获取数据的排好序的数据结构
SQL Server的索引存储是以 B+树 结构来存储的,又称索引树
索引能够提高 SELECT查询和 WHERE子句的速度,却降低了包含 UPDATE语句和 INSERT语句的数据输入过程速度。索引的创建和删除对表中的数据不会产生影响

分类

聚集索引

聚集索引也称为聚簇索引( Clustered Index ),聚集索引是物理地址连续存放的索引,是在表中两个或更多列的基础上建立
特点:只能有一个,一般为主键( 主键一定是聚集索引,聚集索引并不一定是主键 )

Q: 什么情况下主键不是聚集索引
A: 在建表的时候并没有加主键,如果建立了一个聚集索引,再建立主键,那么这个时候主键就不是聚集索引了

隐式索引

由数据库服务器在创建某些对象的时候自动生成。例如:主键约束和唯一约束,数据库服务器会自动创建索引
特点:可以有多个

设计原则

前提

  • 索引不是越多越好,索引需要空间存储,索引太多占用的空间越多
  • 索引页要维护,在增删改数据时索引要重新编排
  • 索引队积久了产生过多的索引碎片不利于查询

思路

  • 小的数据表不应当使用索引
  • 主键一定要建、外键一定要建
  • 经常查询的列或经常用作查询条件的列
  • 经常用在 ORDER BY, GROUP BY, DISTINCT 后面的列
  • 重复值比较多的、经常修改的列不要建立索引
  • 对于 TEXT, IMAGE, BIT 类型的字段不能建立索引

索引语法

创建索引

  1. CREATE [UNIQUE][CLUSTERED/NONCLUSTERED]
  2. INDEX idx/index_表名_索引列名 -- idx 或者 index 为开头是表示这是索引写法,索引名建议这样写增加代码可读性
  3. ON 表名(列名1, 列名1);
  • UNIQUE: 唯一索引。不仅提升查询性能,还能用于保证数据完整性
  • CLUSTERED: 聚集索引
  • NONCLUSTERED: 非聚集索引

  • 没有主键约束的情况下,可以添加聚集索引,因为聚集索引只能有一个

  • 默认情况下,主键是聚集索引。如果一个表中已经存在一个聚集索引,那么主键约束会自动变成非聚集索引

使用索引

  1. EXEC sp_helpindex '表名';
  1. EXEC sp_rename '表名.旧索引名', '新索引名', 'INDEX';
  1. ALTER INDEX 索引名 ON 表名 REBUILD;

删除索引

  1. DROP INDEX 索引名 ON 表名;