![v2-1c4d7ae8d22f98e4bdeec43cc4769585_1440w.jpg?source=172ae18b](http://img-03.proxy.5ce.com/view/image?&type=2&guid=73acd51b-182f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-1c4d7ae8d22f98e4bdeec43cc4769585_1440w.jpg?source=172ae18b)
自动建立的索引
除了显式地(使用CREATE INDEX的SQL语句)建立索引以外,SQL Server还在我们进行以下操作时为我们自动建立索引:
- 设立唯一(UNIQUE)约束:会自动创建一个唯一非聚集索引。唯一约束,就是需要在插入数据时进行唯一检查,那怎么检查呢?不可能使用全表扫描吧?只能通过唯一索引来快速查找。所以,唯一约束本质上是依赖唯一索引的。
此外,删除唯一约束也会同时删除该约束所依赖的唯一索引。 - 设立主键(PRIMARY KEY)约束:
- 如果表上还没有建立聚集索引,会自动创建一个聚集唯一索引
- 如果表上已经有了聚集索引,会自动创建一个非聚集唯一索引
所以要注意,如果面试官问你:主键就是唯一聚集索引吗?你正确的回答是:不一定……
以上SQL Server自动创建的索引,在SQL Server Object Explore中不会显示,我们需要在系统视图(视图的概念后文详述)sys.indexes中查看:
-- [type]:1 聚集; >1 非聚集
演示:
@试一试@:
- 新建一个UNIQUE约束,会不会利用已有的UNIQUE索引
- 删除一个UNIQUE约束依赖的UNIQUE索引,会有什么结果?
合理规划索引
使用索引的目的是为了提高查询的性能。
但是,我们首先要知道使用索引的代价。事实上,天下没有免费的午餐,凡事皆有代价!这是我们在做性能优化的时候尤其要牢记的一点(尤其是“性能控”的同学)。具体来说,索引会:
- 占用更多的磁盘空间。
- 在对数据进行增删改操作时更慢。因为在进行这些操作的同时还要进行索引的维护。
所以,我们在建立索引时应综合考虑以下因素,以确定在某列上有无必要建立索引:
- 表是经常被读(取),还是被写(入)。大多数时候,表的读取操作远大于写入操作(增删改),所以索引的存在是可取的;但是,某些特殊的表,