本文原创作者:蝈蝈俊
使用索引的意义
- 索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
- 使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。
使用索引的代价
- 索引需要占用数据表以外的物理存储空间。
- 创建索引和维护索引要花费一定的时间。
- 当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
创建索引的列
- 主键
- 外键或在表联接操作中经常用到的列
- 在经常查询的字段上最好建立索引
不创建索引的列
- 很少在查询中被引用
- 包含较少的惟一值
- 定义为 text、ntext 或者 image 数据类型的列
Heaps是staging data的很好选择,当它没有任何Index时
- Excellent for high performance data loading (parallel bulk load and parallel index creation after load)
- Excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面几篇博客中分别提到过,下面只是一个简单的大纲,细节请参看前面几篇博客。
何时创建聚集索引?
Clustered Index会提高大多数table的性能,尤其是当它满足以下条件时:
- 独特, 狭窄, 静止: 最重要的条件
- 持续增长的,最好是只向上增加。例如:
- Identity
- Date, identity
- GUID (only when using newsequentialid() function)
聚集索引唯一性(独特型的问题)
由于聚集索引的B+树结构的叶子节点必须指向具体数据。如果你要建立聚集索引的列不唯一,并且你指定的创建的聚集索引是非唯一的聚集索引,则会有以下情况:
如果未使用 UNIQUE 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
聚集索引持续向上增长的需求
具体来说下面两个问题要求建立聚集索引的列最好是持续向上增长的
1、缓存的命中率问题。(需要从B+树的结构分析)
2、连续和不连续的磁盘 I/O 操作对性能的影响 。