SQL SERVER索引的维护优化

 1,索引的定义

索引相当于一本书的目录,通过目录我们可以迅速定位书中要找的内容。索引是数据库中一个用于排序的数据结构,用来快速查询数据库中的数据。索引的数据结构是采用B+树,B+树的特点就是叶子节点包含了所有的关键字信息和data数据,非叶子节点只包含子节点的最大或者最小关键字,用来实现索引。 索引的类型有:分单列索引、组合索引和全文索引。

单列索引:

1,主键索引,数据库表的主键字段会自动创建索引。

2,唯一索引,当某个列添加了Unique约束,也会自动创建唯一索引,要求值必须是唯一的。

3,普通索引,给普通字段添加索引就是普通索引。

组合索引:

多个字段合起来创建一个索引,只有当查询条件中使用了组合索引的第一个字段,索引才会被使用,使用组合索引是遵循最左前缀原则。

2,索引的作用
(1)提高查询效率
(2)确保数据的唯一性
(3)可以加速表和表之间的连接,实现表和表之间的参照完整性
(4)使用分组和排序子句进行数据检索时,可以减少分组和排序的时间
(5)全文检索字段进行搜索优化
假如我们有如下的一张表,在没有引入索引之前,假如我们想查询表中的一条年龄为20的数据,那么几乎要遍历完整个表才能查询到这条数据;现在我们引入索引,并且以age列作为索引列来构建出一个二叉树的索引结构来,具体的构造过程是先把表中第一行的age(49)作为二叉树的头结点,然后顺序往下遍历,把小于头节点的age放到左边,大于头结点的age放到右边,表中数据遍历完以后就构造出了右图所示的二叉树索引结构。现在我们再来试着查找年龄为20的数据所需要的过程:

3,什么场景不适合建索引
(1),在查询中很少使用或者是参考的列不适合创建索引。因为既然这些列很少使用到,因此有无索引,并不能提高查询速度。相反,增加了索引反而降低了系统的维护速度且增大了空间需求。
(2),只有很少数据值的列不适合创建索引。因为本来结果集合就相当于全表查询,因为由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索的速度。
(3),被定义为text, image和bit数据类型的列不适合创建索引。因为这些列的数据量要么相当大,要么取值很少。
(4),当修改性能远远大于检索性能时不应该创建索引。修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
(5),经常插入、删除、修改的表
(6),不会出现在where条件中的字段不适合建立索引。
4,目前收费系统常写SQL语句分析

(1),isnull函数中 的字段是不会使用索引
(2),为了避免使用isnull函数,数据库设计时字段尽量不要允许空,数据类型为字符型的,默认赋值空字符串,数字类类型默认0,布尔类型默认false。