今天简单梳理下,SQL中索引。
【what & why?】
索引是存储引擎用于快速找到记录的一种数据结构.
恰当使用索引,对查询性能优化是最有效的手段,可以轻易将查询性能提高几个数量级。
【创建索引】
一、聚集索引
create clustered index index_name on table_name (column_name) (主键就是一种聚集索引,一张表至多有一个聚集索引。适用于难重复少修改的,如:身份证号)
二、非聚集索引
create nonclustered index index_name on table_name (column_name) (经常用于搜索的字段集,可以创建非聚集索引)
- 普通索引
create index index_name on table_name (column_name) (如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开)
- 唯一索引
create unique index index_name on table_name (column_name) (唯一索引这样创建默认是非聚集的,当然你也可以指定成聚集索引来创建:unique clustered index)
【索引属性】
1.创建索引字段的时候,你会看到字段后面紧跟着排序:asc/desc,啥意思?
答:如果你单独查询某个索引字段,那么出来的结果则会默认按照此排序规则进行排序;若查询中含有其他字段,则排序不起效。
2.创建索引后面会紧跟with,里面都有些配置项及含义?
pad_index={ on | off } ---- 是否索引填充
若开启则可以设置填充因子,如:fillfactor=30,我们可以根据读写比例来灵活调整,以便更大的发挥出索引的特性。极少update:fillfactor=100;高频update:50-70;读写各一半:80-90.statistics_norecompute={ on | off } ---- 是否重新计算统计信息
sort_in_tempdb={ on | off } ---- 是否将排序结果存储在 tempdb 中
ignore_dup_key={ on | off } --- 是否忽视插入重复键在唯一索引中
打开:出现警告消息;关闭:出现错误消息,回滚整个INSERT操作。drop_existing={ on | off } ---- 是否删除已存在的创建一个新的
online={ on | off } ---- 索引被操作时是否支持读写
on:可读写。索引操作期间不长期锁表,仅主要阶段使用意向共享锁。
off:只读不写。索引操作期间锁表。allow_row_locks={ on | off } ---- 是否允许行锁
allow_page_locks={ on | off } ---- 是否允许使用页锁
【删除索引】
drop index index_name on table_name
#真实注意:打算删除索引再创建新索引时,请先创建,创建完后外删除旧索引,否则搜索消耗一下子容易上去!#
【如何看语句执行时间】
set statistics time on
go
--执行语句
set statistics time off