系统性能调优(3)----数据库索引优化

时间:2022-09-18 10:43:26

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。其实道理很简单,比如我们要从字典中查找一个字,那么这个字典就是我们所要面对的数据库,索引就好比是字典前面的拼音或者部首索引表,当需要查询一个字的时候我们首先去检索拼音或者部首索引表,然后再去字典中查找具体的位置,这样我们就加快数据库的查询速度。

索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了(下一篇文章将介绍常见的索引)。显而易见的字典本身的内容以及前面的拼音检索表就是聚簇索引,因为他们都是按照26个字母的顺序排列的。而后面的部首检索表就是一个非聚簇索引,他并不是按照每个字所在的具体的位置排列的,而是通过特定的排列规则进行排序的。

使用索引的好处就是查询起来效率高了,但任何事物都有正反两方面,使用索引也会降低数据库的效率,这里的效率是指在增删改的时候会比不讲索引效率慢。道理很简单如果一本字典随时在变化那么需要变的不仅仅是这个字典的内容还有就是这个字典前面的拼音或者部首检字表。所以有索引的情况下增删改的效率肯定会降低的。

而且需要注意的是有索引不一定效率就会提升,试想一本字典可以把所有的字全部放在检索表中(实际上这是没有意义的)这样的话如果要查询一个字那么就相当于查询了多次,首先在庞大的检索表中查询一遍,然后再去数据库中查询这个字的详细内容,这要比直接从字典查询效率要低。

建立索引不一定就提高查询的效率,这取决于索引是否合理,以及查询是否用到索引。并非是在任何字段上简单地建立索引就能提高查询速度。索引的建立,会带来更多的系统开销,因为系统要耗费资源去维护它,如果建立了没有用到的索引,不适当的索引,过多的索引,反而会导致查询性能下降。总之索引的建立,要看表的结构,数据的分布,还有你要用到哪些数据,如果把索引建立在你根本不需要的数据列上,是根本不会发挥作用的举例如下:

1)全表扫描

只在主键上建立聚集索引:

Selectid,name,dept,emdate from person    用时:20546毫秒(即:21秒)

不在主键上建立聚集索引,只建普通索引

Selectid,name,dept,emdate from person     用时:17923毫秒(即:18秒)

以上查询执行的实际上索引不会发挥作用,因为提取的是全部数据。聚集索引在这里会耗费更多的资源,所以会看到,不建立聚集索引比建立聚集索引还要快

(2):按日期进行过滤(用到索引)

在主键上建立聚集索引,在emdate上建立非聚集索引:

Select id,name,dept,emdatefrom person where     emdate>dateadd(day,+1,getdate()) 用时:12376毫秒(12秒)

在主键上建立聚集索引,在emdate上没有索引:

selectid,name,dept,emdate from person where emdate>dateadd(day,+1,getdate()) 用时:21296毫秒(21秒)

在主键上建立非聚集索引,在emdate上建立非聚集索引:

selectid,name,dept,emdate from person where emdate>dateadd(day,+1,getdate()) 用时:11590毫秒(12秒)

在主键上建立非聚集索引,在emdate上建立聚集索引:

selectid,name,dept,emdate from person where emdate>dateadd(day,+1,getdate()) andemdate<dateadd(day,+3,getdate())  用时:5233毫秒(5秒)

虽然每条语句提取出来的都是30万条数据,各种情况的差异却是比较大的,特别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有几千万条记录的话,差距会更明显。

关于索引方面的系统优化和其他优化一样,都需要根据实际的情况而定,了解了索引的原理那么就能对症下药,合理的建立索引进而提高系统的查询效率。