索引:将结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,我们将这部分信息称之为索引。索引很类似一本字典的目录。
索引分类:聚集索引,非聚集索引
- 每张表上最大的聚集索引数为1;
- 每张表上最大的非聚集索引数为999;
- 每个索引最多能包含的键列数为16;
- 索引键记录大小最多为900字节
索引设计原则
是不是索引越多越好?
肯定不行。
- 索引也是需要空间存储,索引太多意味着占用的空间也越多。
- 索引页也需要系统维护,在增、删、改 数据时索引需要重新编排。就好像一本书某一页被撕掉了,对应的目录也需要重新进行编排。
- 索引堆积久了,由于维护数据过程中会产生过多的索引碎片,反而不利于数据查询。
什么情况下可以建立索引?
- 主键一定要建
- 外键一定要
- 经常查询的列
- 经常用作查询条件的列
- 经常用在order by ,group by, distinct 后面的列
- 重复值比较多的列不能建立索引
- 对于 text,image,bit 这些类型的字段不能建立索引
- 经常存取的列不要建立索引
创建索引
create [unique] [clustered / nonclustered]
index index_name
on table_name(column_name1, column_name2, …)
unique:唯一索引
clustered:聚集索引
nonclustered :非聚集索引
index_name:索引名称
查看索引
exec sp_helpindex 'tableName'
重命名索引
EXEC sp_rename
index_name,
new_index_name,
N'INDEX';
禁用索引
禁用单个
ALTER INDEX index_name
ON table_name
DISABLE;
禁用全部
ALTER INDEX ALL ON table_name
DISABLE;
启用和重建索引
重建索引
ALTER INDEX index_name
ON table_name
REBUILD;
启用已被禁用的索引并重新创建它
CREATE INDEX index_name
ON table_name(column_list)
WITH(DROP_EXISTING=ON)
启用表上所有禁用的索引
ALTER INDEX ALL ON table_name
REBUILD;
启用表中的一个索引
DBCC DBREINDEX (table_name, index_name);
启用表中的所有索引
DBCC DBREINDEX (table_name, " ");
删除索引
删除单个
DROP INDEX [IF EXISTS] index_name
ON table_name;
删除多个
DROP INDEX [IF EXISTS]
index_name1 ON table_name1,
index_name2 ON table_name2,
...;